为什么下面的例子来自箭头的回复输出$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
不进行任何参数或变量扩展,因此通过管道传输不会导致这种情况发生。