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

uru*_*_na 3 bash environment-variables echo

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

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

root@devel:~# env xxx=23 printenv | grep xxx
xxx=23
Run Code Online (Sandbox Code Playgroud)

怎么了

Joh*_*024 7

env xxx=23 echo $xxx
Run Code Online (Sandbox Code Playgroud)

在上面,shell $xxxenv执行之前先求值。因此,没有回声。

更具体地说,外壳看到四个字envxxx=23echo$xxx。它解释env为命令名称和xxx=23echo$xxx作为将被传递到命令三个参数env。它$xxx 传递给命令之前先求值env

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

$ env xxx=23 printenv | grep xxx
xxx=23
Run Code Online (Sandbox Code Playgroud)

同样,请注意:

$ env xxx=23 sh -c 'echo $xxx'
23
Run Code Online (Sandbox Code Playgroud)

由于$xxx在单引号内,因此外壳程序不对其进行求值。取而代之的是运行env有四个参数:xxx=23sh-c,和echo $xxx。后env套环境变量xxx,它执行sh带有参数-cecho $xxx。在$xxx当被评估sh被执行,因此它看到变量xxx