在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
更新在子进程中的场景。
如果要将更改的范围限定为子进程,请将其更改为显式。
a=5; (a=0); echo $a
与管道不同,管道具有POSIX未定义的行为(因此每个shell可以决定如何启发式处理),使用(
... )
的显式子shell语法完全可以说是明确无误的。