我想运行两个命令x和y,并为这些命令定义一个环境变量V.在zsh中有一个简单的方法吗? " bash-like"解决方案,即
(export V=myvalue; x; y)
很麻烦,只适用于子壳,而不是化合物。但是,以下两个版本在语法上无效:
V=myvalue ( x ; y ) # No!
V=myvalue { x ; y } # No!No!No!
答案 0 :(得分:2)
如果没有至少一些额外的代码,这是不可能的。
通过预先设置变量赋值来修改环境仅适用于Simple Commands。这意味着变量赋值之后的第一个单词需要是一个简单的名称(如在#34;不复杂的#34;中)。复杂命令包括{ list }
和( list )
个结构。 (有关完整列表,请参阅documentation on Complex Commands)
如果要在不改变当前shell环境的情况下修改特定命令列表的环境,我可以考虑两种方法来实现
正如问题所述,runnig子shell并明确导出变量有一个相当直接的解决方案:
(export V=myvalue; x; y)
您可以使用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 }