繁体   English   中英

“ env” bash中“ echo”的奇怪行为

[英]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 因此,没有回声。

更详细地讲,外壳程序会看到四个单词envxxx=23echo$xxx 它将env解释为命令名称,并将xxx=23echo$xxx为三个参数,这些参数将传递给命令env $xxx传递给命令env 之前,它会求值。

相比之下,在下文中,没有要评估的Shell变量。 而是用两个参数xxx=23printenv执行env env设置环境变量xxx ,然后执行printenv

$ env xxx=23 printenv | grep xxx
xxx=23

同样,请注意:

$ env xxx=23 sh -c 'echo $xxx'
23

由于$xxx在单引号内,因此外壳程序不会对其进行评估。 而是使用四个参数运行envxxx=23sh-cecho $xxx env设置环境变量xxx ,它将使用参数-c执行shecho $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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM