'env'bash中'echo'的奇怪行为

时间:2017-12-10 08:47:39

标签: bash environment-variables echo

当我在'env'命令中尝试echo变量时,我什么也没得到,但我可以使用'printenv'命令看到它:

root@devel:~# env xxx=23 echo $xxx

root@devel:~# env xxx=23 printenv | grep xxx
xxx=23

这里有什么问题?

2 个答案:

答案 0 :(得分:4)

env xxx=23 echo $xxx

在上面,shell在执行$xxx之前评估env。因此,没有任何回应。

更详细地说,shell会看到四个单词envxxx=23echo$xxx。它将env解释为命令名称,将xxx=23echo$xxx解释为将传递给命令env的三个参数。它会在<{1}} 之前评估将其传递给命令$xxx

相反,在下文中,shell没有要评估的shell变量。相反,env使用两个参数envxxx=23执行。 printenv设置环境变量env,然后执行xxx

printenv

同样,观察:

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

由于$ env xxx=23 sh -c 'echo $xxx' 23 在单引号内,因此shell不会对其进行求值。而是使用四个参数运行$xxxenvxxx=23sh-c。在echo $xxx设置环境变量env后,它会使用参数xxxsh执行-c。执行echo $xxx时会评估$xxx,因此会看到变量sh

答案 1 :(得分:1)

当您运行env xxx=23 echo $xxx时, 变量xxx=23在执行期间对echo进程可见。 但在echo $xxx中,$xxx的价值未由echo评估, 它由当前正在执行的shell评估。 由于env ...调用不会影响当前的shell, $xxx的值是执行此命令之前的任何值(可能未设置)。

echo不是测试env效果的好方法, 因为您无法使echo命令打印在其环境中定义的特定值。 您printenv的示例更好, 因为它会转储它所知道的环境变量的内容。 另一个好的测试是@john在他的回答中写的, 调用另一个shell并使shell打印一个选定的环境变量。 任何能够打印环境变量内容的程序都可以使用。