为什么下面的输出是 `$var` 而不是 `3`?

为什么下面的输出是 `$var` 而不是 `3`?

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

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

  • 首先$var将按字面意义传递到可执行程序的执行环境中/bin/echo,并且
  • 然后在可执行程序的执行环境中,当参数扩展发生时,/bin/echo环境变量适用。var=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

答案1

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

相关内容