我正在尝试通过命令调用具有修改后的环境的 shell 命令env
.
根据说明书
env HELLO='Hello World' echo $HELLO
应该回声Hello World
,但事实并非如此。
如果我做
HELLO='Hello World' bash -c 'echo $HELLO'
它打印Hello World
正如预期的那样(感谢这个答案 https://stackoverflow.com/a/10856348/1922650对于此信息)。
我在这里缺少什么?
这是因为在你的第一种情况下,你当前的 shell 扩展了$HELLO
运行命令之前的变量。而且没有HELLO
当前 shell 中设置的变量。
env HELLO='Hello World' echo $HELLO
会这样做:
- 在本例中展开任何给定的变量
$HELLO
- 使用 3 个参数运行 env
'HELLO=Hello World'
, 'echo'
and ''
(一个空字符串,因为没有HELLO
当前 shell 中设置的变量)
- The
env
命令将运行并设置HELLO='Hello World'
在其环境中
-
env
会跑echo
与论证''
(空字符串)
如您所见,当前的 shell 扩展了$HELLO
变量,未设置。
HELLO='Hello World' bash -c 'echo $HELLO'
会这样做:
- 设置变量
HELLO='Hello World
对于以下命令
- 使用 2 个参数运行 bash
'-c'
and 'echo $HELLO'
- 由于最后一个参数用单引号括起来,因此其中的任何内容都不会被扩展
- 新的 bash 将依次运行命令
echo $HELLO
- 运行回声
$HELLO
在新的 bash 子 shell 中,bash 首先扩展它可以扩展的任何内容,$HELLO
在这种情况下,父 shell 将其设置为Hello World
for us.
- 子shell运行
echo 'Hello World'
如果你尝试做例如这:
env HELLO='Hello World' echo '$HELLO'
- 当前的 shell 会扩展任何它能扩展的东西,但自从
$HELLO
用单引号括起来
- 使用 3 个参数运行 env
'HELLO=Hello World'
, 'echo'
and '$HELLO'
- env 命令将运行并设置
HELLO='Hello World'
在其环境中
- env 将使用参数运行 echo
'$HELLO'
在这种情况下,没有 shell 可以扩展$HELLO
, so echo
接收字符串$HELLO
并打印出来。变量扩展仅由 shell 完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)