当我尝试在“env”命令中回显变量时,我什么也看不到,但是使用“printenv”命令可以看到它:
root@devel:~# env xxx=23 echo $xxx
root@devel:~# env xxx=23 printenv | grep xxx
xxx=23
这里出了什么问题?
当我尝试在“env”命令中回显变量时,我什么也看不到,但是使用“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
之前先计算它。env
以两个参数xxx=23
和printenv
执行。 env
设置环境变量xxx
,然后执行printenv
。$ env xxx=23 printenv | grep xxx
xxx=23
同样地,观察:
$ env xxx=23 sh -c 'echo $xxx'
23
由于$xxx
被包含在单引号中,shell不会对其进行求值。取而代之的是使用四个参数运行env
命令:xxx=23
、sh
、-c
和echo $xxx
。在env
设置环境变量xxx
后,它将使用参数-c
和echo $xxx
执行sh
。当sh
被执行时,$xxx
被求值,因此它看到了变量xxx
。
env xxx=23 echo $xxx
时,变量xxx=23
在echo
进程执行期间变得可见。但是,在echo $xxx
中,$xxx
的值不是由echo
评估的,而是由当前正在执行的shell评估的。由于env ...
调用不会影响当前shell,因此$xxx
的值是执行此命令之前它的值(可能未设置)。echo
不是测试env
效果的好方法,因为您无法使echo
命令打印其环境中定义的特定值。使用printenv
的示例更好,因为它会转储它知道的环境变量的内容。另一个很好的测试是@john在他的答案中写的,调用另一个shell并使shell打印所选环境变量。任何具有打印环境变量内容能力的程序都可以工作。