[英]strange behavior of 'echo' in 'env' bash
当我在'env'命令中尝试echo变量时,什么也没得到,但是我可以使用'printenv'命令看到它:
root@devel:~# env xxx=23 echo $xxx
root@devel:~# env xxx=23 printenv | grep xxx
xxx=23
怎么了
env xxx=23 echo $xxx
在上面,shell在执行env
之前评估$xxx
。 因此,没有回声。
更详细地讲,外壳程序会看到四个单词env
, xxx=23
, echo
和$xxx
。 它将env
解释为命令名称,并将xxx=23
, echo
和$xxx
为三个参数,这些参数将传递给命令env
。 在将$xxx
传递给命令env
之前,它会求值。
相比之下,在下文中,没有要评估的Shell变量。 而是用两个参数xxx=23
和printenv
执行env
。 env
设置环境变量xxx
,然后执行printenv
:
$ env xxx=23 printenv | grep xxx
xxx=23
同样,请注意:
$ env xxx=23 sh -c 'echo $xxx'
23
由于$xxx
在单引号内,因此外壳程序不会对其进行评估。 而是使用四个参数运行env
: xxx=23
, sh
, -c
和echo $xxx
。 env
设置环境变量xxx
,它将使用参数-c
执行sh
并echo $xxx
。 $xxx
sh
在执行sh
时被求值,因此它看到变量xxx
。
当您运行env xxx=23 echo $xxx
,变量xxx=23
在执行过程中对echo
过程可见。 但在echo $xxx
价值$xxx
不会被评估echo
,它是由当前正在执行的外壳进行评估。 而且由于env ...
调用不会影响当前的shell,因此$xxx
的值与执行此命令之前的值相同(可能未设置)。
echo
不是测试env
效果的好方法,因为您不能使echo
命令打印在其环境中定义的特定值。 使用printenv
示例更好,因为它转储了它所知道的环境变量的内容。 另一个好的测试是@john在他的答案中写的内容,它调用另一个shell并使该shell打印一个选定的环境变量。 任何能够打印环境变量内容的程序都可以使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.