子进程内的Zsh更新变量

时间:2017-12-20 21:53:03

标签: shell zsh

在Zsh 5.2中,a=0 | a=1 | b=1; echo $a将返回1,但a=0 | (( a++ )) | b=1; echo $a将返回0.为什么?

至于我的理解,|创建了子进程,并且在子进程中更新a不应该反映在父进程中。这适用于(( a++ ))案例,但如何解释a=1案例?

我明确地将b=1添加为管道的最后一部分,因为在Zsh中,最后一个管道将在父进程中执行(从此处开始:https://www.vidarholen.net/contents/blog/?p=178

  

在Bash中,管道中的所有元素都将在子shell中运行。在Ksh和   Zsh,除了最后一个将在子shell中运行。 POSIX离开了它   未定义。

)。我想创建一个方案,a的更新在子进程中。

1 个答案:

答案 0 :(得分:2)

如果要将更改的范围限定为子进程,请将其更改为显式。

a=5; (a=0); echo $a

与一个管道不同,它具有POSIX未定义的行为(因此每个shell可以决定如何启发式处理),( ... )的显式子shell语法完全是便携式明确无误。