Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';“评估”;MYVALUE=mystring";导出MYVALUE';只在bash中工作而不在zsh中工作?_Bash_Shell_Export_Eval_Zsh - Fatal编程技术网

为什么';“评估”;MYVALUE=mystring";导出MYVALUE';只在bash中工作而不在zsh中工作?

为什么';“评估”;MYVALUE=mystring";导出MYVALUE';只在bash中工作而不在zsh中工作?,bash,shell,export,eval,zsh,Bash,Shell,Export,Eval,Zsh,我试图弄明白为什么以下命令只在bash中有效,而不在zsh中有效: ➜ ~ eval "MYVALUE=mystring" env | grep MYVALUE MYVALUE=mystring 狂欢节: Zsh: 我希望zsh打印mystring,但它没有打印任何内容 看起来,export无法读取刚刚解析的值,但实际上,eval正在工作,因为如果我使用zsh运行另一个命令: ➜ ~ eval "MYVALUE=mystring" env | grep MYVALUE MYVALUE=my

我试图弄明白为什么以下命令只在
bash
中有效,而不在
zsh
中有效:

➜  ~ eval "MYVALUE=mystring" env | grep MYVALUE
MYVALUE=mystring
狂欢节:

Zsh:

我希望
zsh
打印
mystring
,但它没有打印任何内容

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

➜  ~ eval "MYVALUE=mystring" env | grep MYVALUE
MYVALUE=mystring
它按预期工作


有谁能帮我弄清楚为什么eval/export不能与
zsh
一起工作,而只能与
bash
一起工作,以及最终如何使它与
zsh
一起工作?非常感谢你

bash和zsh在这方面的差异与eval无关,而是与导出相关的细微差异

使用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之间的区别:

而在两个shell中,形式为

A=B C
执行C,其中在修改后的环境中,a设置为B,bash导出是一个命令并“看到”修改后的环境。这意味着

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

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

eval "MYVALUE=mystring;" export MYVALUE
或者重写为

eval export "MYVALUE=mystring"

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

经过一些尝试和错误,多亏@glenn jackman的提示,我可以说一个既适用于
bash
又适用于
zsh
的可能解决方案是:

eval "MYVALUE=mystring"; export MYVALUE

基本上我们需要添加
在导出之前

为什么要使用
eval
export MYVALUE=mystring
MYVALUE=mystring有什么问题;导出MYVALUE
?@glennjackman很抱歉,您在此处缺少一些上下文。我需要
eval
一个更复杂的脚本,并导出一些在此脚本中定义的变量。对于bash,一切都正常,而对于zsh,一切都不正常。我把问题缩小到了eval/export的范围,以便更容易复制和获得帮助。@glennjackman您实际上提出了一个有效的解决方案:)如果我执行
eval“MYVALUE=mystring”;export MYVALUE
它可以在bash和zsh上工作。让我们看看是否有其他方法,但这对我来说绝对有效!我不是zsh用户,所以我不能提供任何更具体的信息。哦,对不起!我只是在我把我的答案贴在下面之后才看到你贴了答案。我可以接受你的答复,因为你花了这么多精力来答复。
eval "MYVALUE=mystring"; export MYVALUE