当我在'env'命令中尝试echo变量时,我什么也没得到,但我可以使用'printenv'命令看到它:
root@devel:~# env xxx=23 echo $xxx
root@devel:~# env xxx=23 printenv | grep xxx
xxx=23
这里有什么问题?
答案 0 :(得分:4)
env xxx=23 echo $xxx
在上面,shell在执行$xxx
之前评估env
。因此,没有任何回应。
更详细地说,shell会看到四个单词env
,xxx=23
,echo
和$xxx
。它将env
解释为命令名称,将xxx=23
,echo
和$xxx
解释为将传递给命令env
的三个参数。它会在<{1}} 之前评估将其传递给命令$xxx
。
相反,在下文中,shell没有要评估的shell变量。相反,env
使用两个参数env
和xxx=23
执行。 printenv
设置环境变量env
,然后执行xxx
:
printenv
同样,观察:
$ env xxx=23 printenv | grep xxx
xxx=23
由于$ env xxx=23 sh -c 'echo $xxx'
23
在单引号内,因此shell不会对其进行求值。而是使用四个参数运行$xxx
:env
,xxx=23
,sh
和-c
。在echo $xxx
设置环境变量env
后,它会使用参数xxx
和sh
执行-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打印一个选定的环境变量。
任何能够打印环境变量内容的程序都可以使用。