我刚刚遇到!$
(不带引号)。我以前没有遇到过这个并做了一些测试:
$ 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