问题是关于特殊变量。文档说:
!!:$
指定前面命令的最后一个参数。可以将其缩短为!$。
(
$_
,下划线。)在shell启动时,设置为用于调用在环境或参数列表中传递的正在执行的shell或shell脚本的绝对路径名。随后,扩展到扩展后的上一个命令的最后一个参数。还设置为用于调用每个执行的命令的完整路径名,并将其放置在导出到该命令的环境中。
我一定无法捕捉到一些差异,因为:
$ echo "hello" > /tmp/a.txt
$ echo "!$"
echo "/tmp/a.txt"
/tmp/a.txt
$ echo "hello" > /tmp/a.txt
$ echo $_
hello
有什么不同?
4
$是历史扩展,不是特殊变量,因此我假设bash代码以不同的方式处理它们。
—
杰夫·谢勒
对于这个问题,我没有明确的答案,但是:①Bourne shell语言可能是当今仍广泛使用的内部一致性最低的编程语言之一。试图推论一般原则将无济于事。您只需要记住所有特殊规则。抱歉。②在的定义中,在突出显示的短语之后立即注意单词“扩展后”
—
zwol
$_
。这很关键。它可能无法解释让您感到困惑的差异,但确实可以解释许多其他方式$_
,!$
而且并不相同。