我试图弄清楚为什么以下命令仅对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
吗?非常感谢!
答案 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的提示,我可以说一个同时适用于bash
和zsh
的解决方案是:
eval "MYVALUE=mystring"; export MYVALUE
基本上,我们需要在;
之前添加export