为什么shell变量在命令前缀时会成为环境变量?

时间:2015-11-21 23:49:42

标签: bash shell

如果我在bash shell中输入以下命令:

STUFF=Blah env | grep STUFF

我很困惑为什么它会返回STUFF=Blah,因为我希望得到一个空输出。

我感到困惑的原因是因为(据我所知)STUFF=Blah将STUFF设置为 shell 变量,但env命令返回所有环境变量。

但在上面STUFF=Blah似乎被设置为环境变量。我的理解在哪里出错了?

2 个答案:

答案 0 :(得分:5)

从bash手册页(环境部分):

  

任何简单命令或函数的环境都可以通过在其前面添加参数赋值来临时扩充,如上面PARAMETERS中所述。这些赋值语句仅影响该命令所见的环境。

这意味着您对命令开头的STUFF=Blah的理解不正确。在命令之前使用时,它为正在运行的命令设置环境变量。当它自己使用时(仅STUFF=Blah没有任何进一步的命令),它就会设置一个本地shell变量。

答案 1 :(得分:4)

使用变量赋值的前缀命令会导致该命令在设置了该变量的环境中运行。 env命令在其环境中将STUFF设置为Blah,但不会将当前shell设置为(export STUFF=Blah; env | grep STUFF)

大致相当于

STUFF

因为env的分配不会影响当前的shell,只会影响STUFF。 (我说"粗略地说#34;,因为在这个例子中env处于子shell中执行的每个命令的环境中,而不仅仅是{{1}}。)