我正在看一个教程,其中提到要运行此命令:
sudo chmod 700 !$
我不熟悉!$
。这是什么意思?
echo $(rm -rf /)
--no-preserve-root
在其中使用该选项,并且如果在程序中看到“不保留”一词,则最好仔细考虑其作用。
我正在看一个教程,其中提到要运行此命令:
sudo chmod 700 !$
我不熟悉!$
。这是什么意思?
echo $(rm -rf /)
--no-preserve-root
在其中使用该选项,并且如果在程序中看到“不保留”一词,则最好仔细考虑其作用。
Answers:
基本上,它是上一个命令的最后一个参数。
!$
是上一个命令的“结尾”。请考虑以下示例:我们首先在文件中查找单词: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
节是单独的。
!$
insert-last-argument
,通常绑定到M-.
。
严格来讲,!$
是历史记录列表中最后一条命令的最后一个字。
单词-被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
echo
如果不确定要做什么,通常尝试一下是安全的。