我试图通过命令env
调用带有修改环境的shell命令。
根据手册
env HELLO='Hello World' echo $HELLO
应该回显Hello World
,但事实并非如此。
如果我做
HELLO='Hello World' bash -c 'echo $HELLO'
按预期打印Hello World
(感谢this answer获取此信息)。
我在这里缺少什么?
干杯, 尼古拉斯
答案 0 :(得分:44)
这是因为在您的第一种情况下,您的当前shell会在运行命令之前扩展$ HELLO变量。并且在当前shell中没有设置HELLO变量。
env HELLO='Hello World' echo $HELLO
会这样做:
如您所见,当前shell扩展了$ HELLO变量,该变量未设置。
HELLO='Hello World' bash -c 'echo $HELLO'
会这样做:
HELLO='Hello World
echo $HELLO
如果你试图做,例如这样:
env HELLO='Hello World' echo '$HELLO'
在这种情况下,没有shell会扩展$ HELLO,因此echo接收字符串$HELLO
并打印出来。变量扩展仅由shell完成。
答案 1 :(得分:4)
我认为发生的事情类似于this situation,其中我也感到困惑。
简而言之,第一种情况下的变量扩展是由当前shell在其环境中没有$HELLO
完成的。但是在第二种情况下,单引号会阻止当前shell执行变量扩展,因此一切都按预期工作。
请注意,将单引号更改为双引号会阻止此命令以您希望的方式运行:
HELLO='Hello World' bash -c "echo $HELLO"
现在这将失败的原因与你问题中的第一个命令相同。
答案 2 :(得分:2)
这对我很有用
$ MY_VAR='Hello' ANOTHER_VAR='World!!!' && echo "$MY_VAR $ANOTHER_VAR"
Hello World!!!
答案 3 :(得分:0)
这是一种更简单的方法来确认shell是否按预期工作。
env A=42 env
env
第一个命令将集A
运行到42并运行env
。第二个命令也运行运行env
。比较两者的输出。
答案 4 :(得分:0)
正如 nos 所指出的,传递给 echo
的变量的扩展发生在该变量被设置之前。
之前的答案中尚未提到的一种替代方法是使用:
$ a=abc eval 'echo $a'
abc
$ echo $a
<blank>
请注意,您必须使用 a=abc cmd
语法而不是 env a=abc cmd
语法;显然,env
与内置的 eval
不兼容。