【问题标题】:Why 'eval "MYVALUE=mystring" export MYVALUE' only works from bash and not zsh?为什么 'eval "MYVALUE=mystring" export MYVALUE' 只适用于 bash 而不是 zsh?
【发布时间】:2019-06-09 17:25:51
【问题描述】:

我试图弄清楚为什么以下命令只适用于 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

它按预期工作!

谁能帮我弄清楚为什么 eval / export 不能与zsh 一起使用,但可以与bash 一起使用,以及最终如何使其也与zsh 一起使用?非常感谢!

【问题讨论】:

  • 你为什么要使用evalexport MYVALUE=mystringMYVALUE=mystring; export MYVALUE 有什么问题?
  • @glennjackman 抱歉,您在这里缺少一些上下文。我需要eval 一个更复杂的脚本并导出一些在这个脚本中定义的变量。使用 bash 一切正常,使用 zsh 则不行。我将问题范围缩小到 eval / export ,以便更容易重现和获得帮助。
  • @glennjackman 您实际上提出了一个有效的解决方案:) 如果我这样做 eval "MYVALUE=mystring"; export MYVALUE 它适用于 bash 和 zsh。让我们看看是否有其他方法,但这绝对适合我!
  • 我不是 zsh 用户,所以无法提供更具体的信息。

标签: bash shell export eval zsh


【解决方案1】:

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

eval "MYVALUE=mystring"; export MYVALUE

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

【讨论】:

    【解决方案2】:

    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 的区别:

    在两个 shell 中,一个语句的形式

    A=B C
    

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

    A=B export A
    

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

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

    eval "MYVALUE=mystring;" export MYVALUE
    

    或者改写成

    eval export "MYVALUE=mystring"
    

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

    【讨论】:

    • 哦,对不起!我在下面发布了我的答案后才看到您发布了答案。我可以接受您的回复,因为您竭尽全力回复。
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 2012-09-01
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2021-04-08
    • 2012-10-10
    相关资源
    最近更新 更多