bash 管道运行中的第一个命令能够修改父进程变量?为什么?
First command in a bash pipe runs is able to modify parent process variable? Why?
我正在使用 bash 版本 4.3.4
我知道一般来说,内置命令不应该被分叉(shell 直接执行命令,而不调用另一个程序。)
在胡乱摆弄管子的时候看到了下面不明白的东西:
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
它提供了我相信您认为您的命令正在执行的语义。
我正在使用 bash 版本 4.3.4
我知道一般来说,内置命令不应该被分叉(shell 直接执行命令,而不调用另一个程序。)
在胡乱摆弄管子的时候看到了下面不明白的东西:
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
它提供了我相信您认为您的命令正在执行的语义。