为什么命令前面的变量赋值被忽略?

为什么命令前面的变量赋值被忽略?

bash 4.1 联机帮助页指出(强调已添加)...

简单命令

一个简单的命令是一系列可选变量赋值,后跟空格分隔的单词和重定向,并由控制操作员终止。首先单词指定要执行的命令,并作为参数零传递。其余单词作为参数传递给调用的命令。

验证我的系统上的版本(未针对炮弹休克进行修补)...

#  bash --version
GNU bash, version 4.1.0(1)-release (i686-pc-linux-gnu) ...

然而,前面的变量赋值(不带分号)应该是一种仅在该命令调用的生命周期内本地化环境变量值的方法,但似乎并不......

#  x=123 echo $x; unset x; echo $x
bash: x: unbound variable
#  x=123; echo $x; unset x; echo $x
123
bash: x: unbound variable
#  x=123; echo $x | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable
#  x=123 echo $x | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123" echo "$x" | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123"; echo "$x" | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable

解决方案
这个答案来自另一个问题看来该命令必须故意使用其父级的环境变量,但echo事实并非如此。但是 shell 调用就像bash -cdo ...

x=123 bash -c 'echo $x'; unset x; echo $x
123
bash: x: unbound variable

资源

答案1

这条线

x=123 echo $x

按以下顺序评估:

  1. $x被扩展为 的x当前的壳。
  2. x将要执行的命令的环境中的值设置为123
  3. 在扩展的命令行中搜索命令并echo找到。
  4. echox在设置为 123 的环境中运行,并$1设置为x步骤 1 中的任何值。
  5. echo输出$1到标准输出,但忽略其环境中的其他值。

请注意,$x作为参数与x命令之前的参数是分开的。

相关内容