Bash 中的意外行为

Bash 中的意外行为

man bash

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

因此这样写是完全合法的:

foo=bar echo $foo

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

$ foo=bar printenv
foo=bar
TERM=rxvt-unicode
[...]

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

答案1

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

答案2

如果你在一行中执行foo=barecho $foo,它将不起作用。你必须做以下三件事之一。

  1. 将它们作为单独的命令运行。即:foo=bar Enter echo $foo

  2. 将它们放在一行上运行,但两者之间用分号隔开。即:foo=bar; echo $foo

  3. 与 #2 相同,但带有双 & 符号。即:foo=bar && echo $foo

2和3的区别在于,3只有echo $foo成功才会执行foo=bar

答案3

尝试:

foo=bar; echo $foo
       ^

请注意,;由于您试图将两个单独的命令放在一行中。默认情况下,它们不能一起工作。

答案4

正确的做法是:

foo=bar sh -c 'echo $foo'

相关内容