!$是什么意思?


32

我正在看一个教程,其中提到要运行此命令:

sudo chmod 700 !$

我不熟悉!$。这是什么意思?


5
echo如果不确定要做什么,通常尝试一下是安全的。
2013年

8
@Shadur,并非总是如此。 echo $(rm -rf /)
cjm

1
@cjm除非您使用的是真正的旧系统,否则您将需要--no-preserve-root在其中使用该选项,并且如果在程序中看到“不保留”一词,则最好仔细考虑其作用。
wchargin 2013年

4
@WChargin要非常小心,假设“确实很老”和“不是Linux /不使用GNU coreutils”是同一回事。他们不是。
克里斯·

Answers:


44

基本上,它是上一个命令的最后一个参数。

!$是上一个命令的“结尾”。请考虑以下示例:我们首先在文件中查找单词:

grep -i joe /some/long/directory/structure/user-lists/list-15

如果joe在该用户列表中,我们希望将其从其中删除。我们可以使用该长目录树作为参数来启动vi,也可以像将vi !$哪一个bash扩展为:

vi /some/long/directory/structure/user-lists/list-15

(顺便说一下,来源;方便的指南)


这个!$标记和特殊的shell变量之间的区别是毫无价值的$_。实际上,两者都扩展到上一个命令的最后一个参数。但是,!$历史记录扩展过程中将进行扩展,而$_参数扩展过程中将进行扩展。这样的一个重要结果是,当您使用时!$扩展的命令将保存在您的历史记录中。

例如,考虑击键

  • echo Foo Enter echo !$ Jar Enter Up Enter; 和

  • echo Foo Enter echo $_ Jar Enter Up Enter

(唯一更改的字符是$!$_,位于中间。)

在前者中,当您按时Up,命令行将读取echo Foo Jar,因此写入stdout的最后一行是Foo Jar

在后者中,当您按时Up,命令行将读取echo $_ bar,但现在$_的值与以前不同-实际上,$_现在是Jar,因此写入stdout的最后一行是Jar Jar

另一个结果是_可以在其他参数扩展中使用,例如命令序列

printf '%s '    isomorphism
printf '%s\n'   ${_%morphism}sceles

版画isomorphism isosceles。但是没有类似的${!$%morphism}扩展。

有关Bash扩展阶段的更多信息,请参阅参考资料EXPANSION部分man 1 bash(在线版本中称为Shell Expansions)。本HISTORY EXPANSION节是单独的。


6
真好 很高兴知道。同样,好东西是Stack Exchange。很难在Google上搜索类似的内容!$
Andrew

4
顺便说一句,在命令行上,您可以通过插入上一个命令的最后一个参数insert-last-argument,通常绑定到M-.
choroba

1
@Andrew如果回答了您的问题,请记住接受。接受和支持而不是发表评论是SE网络上表达感谢的方式,请参见此处的“官方”立场。
terdon

1
@Andrew仅供参考,我在Google上搜索了“ bash bang dollar”,并获得了不错的结果,包括此链接作为第三清单。
wchargin 2013年

1
@terdon我昨晚试图接受答案,但是它是如此之快,以至于我不得不等待接受它。
安德鲁

4

严格来讲,!$是历史记录列表中最后一条命令的最后一个字。

单词-被shell视为一个单元的一系列字符。单词中不得包含未引用的元字符。

元字符-当不加引号时,用于分隔单词的字符。元字符是空格或以下字符之一:'|','&',';','(',')','<'或'>'

空白-空格或制表符。

例子:

set -o history # enable command history
set -o histexpand # enable ! style history substitution

HISTSIZE=10

# save all lines on the history list    
HISTCONTROL=
HISTIGNORE=

date
echo !$ # prints date

date>/dev/null
echo !$ # prints /dev/null

echo a b c>/dev/null
echo !$ # prints /dev/null

HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list
echo a b c
 echo d e f # space at the beginning
echo !$ # prints c


-3

!$ 将为您提供该特定用户使用的最后一个命令。

您还可以通过使用history命令找到以前使用的命令的历史记录。

注意:对于特定用户,先前使用的所有命令都将存储在bash历史记录文件中。


1
其他答案是正确的。这是错误的。
斯科特,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.