如何解决bash管道运行中的第一个命令是否能够修改父过程变量?为什么?
-
我正在使用bash版本4.3.4
-
我知道一般而言,内置命令不应该被派生(shell无需调用其他程序即可直接执行命令。)
在随机使用管道时,我看到了以下我不理解的东西:
a)如果我将shell变量设置为:a = 1,然后运行:a = 2 | a = 3; echo $ a | echo $ a->我将得到a = 1(什么都没有修改)
b)当a = 1时,因为先前的命令没有修改任何内容,所以我尝试运行:a = 2; echo $ a | a = 3; echo $ a |回声$ a,它将使我在回显上的回声回复中甚至在正常的“回声$ a”中也得到a = 2。
我可以尝试在管道中的任何其他位置(例如在“ a)”中将“ a = x”与另一个a值放在一起,但是变量“ a”将保持不变。 为什么管道第一部分中的“ echo $ a”会修改父级外壳中的“ a”变量?
解决方法
问题的格式使您很难确定是什么使您感到困惑,但请注意:
a=2; echo $a | a=3; echo $a | echo $a
与以下内容完全相同:
a=2
echo $a | a=3
echo $a | echo $a
也许可以为您澄清正在发生的事情。如果您能够通过执行以下操作在顶级外壳中更改变量,将会令人惊讶:
{ a=2; echo $a; } | { a=3; echo $a; } | echo $a
它提供了我认为您认为您的命令正在执行的语义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。