是否应该引用历史扩展?

是否应该引用历史扩展?

我刚刚遇到!$(不带引号)。我以前没有遇到过这个并做了一些测试:

$ ls -l
(...some output...)
$ echo !$
-l
$ echo "!$"
-l

man bash在历史扩展部分中这样说:

$最后一个字。这通常是最后一个参数,但如果行中只有一个单词,则会扩展到第零个单词。

很公平。但我到底应该引用还是不引用呢?另一项关于历史扩展的测试让我产生疑问:

$ man bash
$ "!!"
"man bash"
bash: man bash: command not found

这是可以预料到的。但那么呢!$?这是一个词,所以我想应该引用它......

(我将在这里冒险这个新标签:.)

答案1

这取决于您是否要在历史扩展中的单词周围添加一组引号。

假设foo="abc def",比较

$ echo $foo
$ printf "<%s>\n" !$

$ echo $foo
$ printf "<%s>\n" "!$"

前者生成printf "<%s>\n" $foo,调用分词,并printf在格式字符串后获取两个参数。第二个产生printf "<%s>\n" "$foo",其中引号像往常一样防止分词。

当然,如果你要这样做:

$ echo "$foo"

然后,以下命令中的 a!$已经扩展为"$foo",并且引号已经就位。现在,使用"!$"将产生""!$"",其中引号有效地相互抵消。

答案2

历史替换检索任何被解析为最后一个单词、引号和所有内容,

$ echo this that "the other"
this that the other
$ echo !$
the other

它首先运行,因此您可以检索并重新运行其他替换

$ echo `date`
Mon May 21 13:53:37 PDT 2018
$ echo !$
Mon May 21 13:53:38 PDT 2018

相关内容