为什么“ eval“ MYVALUE = mystring”导出MYVALUE”仅可用于bash而不适用于zsh?

时间:2019-01-15 16:45:06

标签: bash shell export eval zsh

我试图弄清楚为什么以下命令仅对bash有效而不对zsh有效:

重击:

bash-3.2$ eval "MYVALUE=mystring" export MYVALUE
bash-3.2$ echo $MYVALUE
mystring

Zsh:

➜  ~ eval "MYVALUE=mystring" export MYVALUE
➜  ~ echo $MYVALUE

➜  

我希望zsh打印mystring,但是它什么也没打印。

看来export无法读取刚刚解析的值,但实际上eval在工作,因为如果我使用zsh运行此命令:

➜  ~ eval "MYVALUE=mystring" env | grep MYVALUE
MYVALUE=mystring

它按预期工作!

有人可以帮助我弄清楚为什么评估/导出功能不适用于zsh而是适用于bash以及最终如何使其适用于zsh吗?非常感谢!

2 个答案:

答案 0 :(得分:1)

在这方面,bash和zsh之间的差异与eval无关,而是与 export 有关的细微差异。

您使用3个参数执行eval

"MYVALUE=mystring" 
export 
MYVALUE

现在,zsh手册页(至少在我的zsh版本中)在描述eval在使用多于参数调用时所执行的操作时有点误导,但是一个简单的实验显示了正在发生的情况:

eval 'A=BBBBBB' 'printenv A'

输出 BBBBBB 。实际上,eval似乎将其参数串在一起成为单个字符串,但用空格将各个部分分开。因此,就您而言,

eval "MYVALUE=mystring" export MYVALU

等同于

eval "MYVALUE=mystring export MYVALU"

反过来就是

MYVALUE=mystring export MYVALU

这是bash和zsh之间的区别:

在两个外壳中都使用以下形式的声明

A=B C

执行C,在A设置为B的修改环境中,bash export 是命令并“查看”修改后的环境。这意味着

A=B export A

bash导出命令“看到” A的设置并导出变量。在zsh中,导出只是一个关键字,修改后的环境将被忽略。

因此,例如,您需要在zsh中使用两个单独的语句

eval "MYVALUE=mystring;" export MYVALUE

或将其重写为

eval export "MYVALUE=mystring"

当然,这仍然是一个问题,为什么您首先要使用eval。

答案 1 :(得分:0)

经过一番尝试和错误,并感谢@ glenn-jackman的提示,我可以说一个同时适用于bashzsh的解决方案是:

eval "MYVALUE=mystring"; export MYVALUE

基本上,我们需要在;之前添加export