如果我在bash shell中输入以下命令:
STUFF=Blah env | grep STUFF
我很困惑为什么它会返回STUFF=Blah
,因为我希望得到一个空输出。
我感到困惑的原因是因为(据我所知)STUFF=Blah
将STUFF设置为 shell 变量,但env
命令返回所有环境变量。
但在上面STUFF=Blah
似乎被设置为环境变量。我的理解在哪里出错了?
答案 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}}。)