Bash 中的意外行为

cYr*_*rus 7 bash environment-variables

来自man bash

一个简单的命令是一系列可选的变量赋值
后跟空格分隔的单词和重定向,以及
由控制操作员终止。第一个词指定
要执行的命令,并作为参数零传递。这
剩余的单词作为参数传递给调用的命令。

所以这样写是完全合法的:

foo=bar echo $foo
Run Code Online (Sandbox Code Playgroud)

但它不像我预期的那样工作(它只打印一个换行符)。这对我来说很奇怪,因为:

$ foo=bar printenv
foo=bar
TERM=rxvt-unicode
[...]
Run Code Online (Sandbox Code Playgroud)

有人可以解释我哪里做错了吗?

Dae*_*yth 6

这是因为变量扩展是在命令运行之前完成的。在发生变量扩展时,foo未设置,因此它扩展为空字符串。然后运行该命令,设置foo.