我可以在Zsh中为子shell或复合命令设置环境变量吗?

时间:2016-06-07 13:53:52

标签: zsh

我想运行两个命令x和y,并为这些命令定义一个环境变量V.在zsh中有一个简单的方法吗? " bash-like"解决方案,即

(export V=myvalue; x; y)

很麻烦,只适用于子壳,而不是化合物。但是,以下两个版本在语法上无效:

V=myvalue ( x ; y ) # No!
V=myvalue { x ; y } # No!No!No!

2 个答案:

答案 0 :(得分:2)

如果没有至少一些额外的代码,这是不可能的。

通过预先设置变量赋值来修改环境仅适用于Simple Commands。这意味着变量赋值之后的第一个单词需要是一个简单的名称(如在#34;不复杂的#34;中)。复杂命令包括{ list }( list )个结构。 (有关完整列表,请参阅documentation on Complex Commands

如果要在不改变当前shell环境的情况下修改特定命令列表的环境,我可以考虑两种方法来实现

  1. 正如问题所述,runnig子shell并明确导出变量有一个相当直接的解决方案:

    (export V=myvalue; x; y)
    
  2. 您可以使用eval来避免创建子shell:

    V=myvalue eval "x; y"
    V=myvalue eval x\; y
    

    与第一个解决方案相比,这也节省了三到四个字符。主要缺点似乎是完成在eval的参数列表中不能很好地工作。

答案 1 :(得分:1)

时间稍长,但不多。您可以定义一个函数,然后立即将其称为简单命令。

f () { x; y; }; V=foo f

或者,您可以使用匿名函数进行本地导出:

() { local -x V=myvalue; x; y }