为什么跟随输出`$var`而不是`3`?

Tim*_*Tim -7 bash

为什么下面的例子来自Arrow 的回复输出$var而不是3

我单引号或反斜杠$var'$var'or \$var,希望

  • first$var将逐字传递到可执行程序的执行环境中/bin/echo,并且
  • 然后在可执行程序的执行环境中/bin/echovar=3当发生参数扩展时应用环境变量$var

为什么在可执行程序的执行环境中不会发生参数扩展/bin/echo笔记:

  • 在原shell中,$var是单引号或反斜杠,所以在原shell的执行环境中不应该展开。

  • 原来的shell去掉了周围的单引号或者反斜杠$var,然后把$var环境变量var=3传入到执行环境中运行/bin/echo,所以我认为参数扩展$var 应该发生在运行的执行环境中/bin/echo

请注意,我使用set -x打印出跟踪信息,但无法弄清楚扩展后但执行前的实际结果。

谢谢。

tim$ unset var
$ set -x

tim$ var=3 /bin/echo '$var'
+ var=3
+ /bin/echo '$var'
$var

tim$ var=3 /bin/echo \$var
+ var=3
+ /bin/echo '$var'
$var

$ var=3 exec /bin/echo \$var | cat
+ cat
+ var=3
+ exec /bin/echo '$var'
$var

tim$ var=3 exec /bin/echo '$var' | cat
+ var=3
+ exec /bin/echo '$var'
+ cat
$var
Run Code Online (Sandbox Code Playgroud)

Dop*_*oti 5

在每一种情况下,你要么是强引用,这会阻止变量的扩展;或转义$字符,这也使其不再是受扩展的变量。 /bin/echo并且cat不进行任何参数或变量扩展,因此管道不会导致这种情况发生。