从man bash
:
简单命令是一系列可选的变量赋值 后面跟着空格分隔的单词和重定向,以及 由控制操作符终止。第一个字指定 要执行的命令,并作为参数零传递。 剩余的单词作为参数传递给调用的命令。
因此这样写是完全合法的:
foo=bar echo $foo
但它并没有像我预期的那样工作(它只打印了一个换行符)。这对我来说很奇怪,因为:
$ foo=bar printenv
foo=bar
TERM=rxvt-unicode
[...]
有人可以解释一下我哪里做错了吗?
答案1
发生这种情况的原因是变量扩展是在命令运行之前完成的。在变量扩展发生时,foo
尚未设置,因此它扩展为空字符串。然后命令运行,设置foo
。
答案2
如果你在一行中执行foo=bar
和echo $foo
,它将不起作用。你必须做以下三件事之一。
将它们作为单独的命令运行。即:
foo=bar
Enterecho $foo
将它们放在一行上运行,但两者之间用分号隔开。即:
foo=bar; echo $foo
与 #2 相同,但带有双 & 符号。即:
foo=bar && echo $foo
2和3的区别在于,3只有echo $foo
成功才会执行foo=bar
。
答案3
尝试:
foo=bar; echo $foo
^
请注意,;
由于您试图将两个单独的命令放在一行中。默认情况下,它们不能一起工作。
答案4
正确的做法是:
foo=bar sh -c 'echo $foo'