bash 管道运行中的第一个命令能够修改父进程变量?为什么?

First command in a bash pipe runs is able to modify parent process variable? Why?

在胡乱摆弄管子的时候看到了下面不明白的东西:

a) 如果我将 shell 变量设置为:a=1 然后 运行:a=2 |一=3;回声 $a | echo $a --> 我会得到 a=1(没有修改)

b) 虽然 a=1 因为之前的命令没有任何修改,我然后尝试 运行: a=2;回声 $a |一=3;回声 $a | echo $a 这将在 stoud 的 echo 回复中给我 a=2,甚至在正常的“echo $a”之后。

我可以尝试将“a=x”和 a 的另一个值放在管道中的任何其他位置,例如在“a)”中,但变量“a”将保持不变。 为什么管道第一部分中的“echo $a”修改了父项中的“a”变量shell?

问题的格式很难确定是什么让您感到困惑,但请注意:

a=2; echo $a | a=3; echo $a | echo $a

完全相同:

a=2
echo $a | a=3
echo $a | echo $a

也许这让您明白了发生了什么。如果您能够通过以下方式更改顶层 shell 中的变量,那将是令人惊讶的:

{ a=2; echo $a; } | { a=3; echo $a; } | echo $a

它提供了我相信您认为您的命令正在执行的语义。