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

Bash 为什么shell变量作为命令前缀时会变成环境变量?,bash,shell,Bash,Shell,如果在bash shell中键入以下命令: STUFF=Blah env | grep STUFF 我不明白为什么它会返回STUFF=Blah,因为我希望得到一个空输出 我感到困惑的原因是(据我所知)STUFF=Blah将STUFF设置为shell变量,但env命令返回所有环境变量 但是在上面的STUFF=Blah中,似乎设置为一个环境变量。我的理解哪里出错了?在命令前面加上变量赋值会导致该命令在设置了该变量的环境中运行。env命令会在其环境中看到STUFF设置为Blah,但不会看到当前she

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

STUFF=Blah env | grep STUFF
我不明白为什么它会返回
STUFF=Blah
,因为我希望得到一个空输出

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


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

在命令前面加上变量赋值会导致该命令在设置了该变量的环境中运行。
env
命令会在其环境中看到
STUFF
设置为
Blah
,但不会看到当前shell

大致相当于

(export STUFF=Blah; env | grep STUFF)
因为对
STUFF
的赋值不影响当前shell,只影响
env
。(我说“粗略”,因为在本例中,
STUFF
位于子shell中执行的每个命令的环境中,而不仅仅是
env

来自bash手册页(环境部分):

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


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

并且因为它只影响紧接着的命令,所以设置shell变量对它来说是没有用的。