我正在阅读一个教程,它提到运行此命令:
sudo chmod 700 !$
我不熟悉!$
。这是什么意思?
答案1
基本上,它是上一个命令的最后一个参数。
!$
是上一个命令的“结束”。考虑以下示例:我们首先在文件中查找单词:grep -i joe /some/long/directory/structure/user-lists/list-15
如果 joe 在该用户列表中,我们想将他从其中删除。我们可以使用长目录树作为参数来启动 vi,或者简单地像
vi !$
Which bash 扩展为:vi /some/long/directory/structure/user-lists/list-15
(来源;顺便说一下,方便的指南)
!$
这个标记和特殊的 shell 变量之间的区别毫无意义$_
。的确,两个都展开到上一个命令的最后一个参数。然而,!$
在期间扩大历史扩展,同时$_
在期间展开参数扩展。这样做的一个重要后果是,当您使用 时!$
,扩大命令保存在您的历史记录中。
例如,考虑击键
echo Foo
Enterecho !$ Jar
Enter Up Enter;和echo Foo
Enterecho $_ Jar
Enter Up Enter。
(唯一改变的字符是中间的$!
和。)$_
在前者中,当您按 时Up,命令行会读取echo Foo Jar
,因此写入 stdout 的最后一行是Foo Jar
。
在后者中,当您按 时Up,命令行会显示echo $_ bar
,但现在$_
的值与之前不同,实际上$_
是 now Jar
,因此写入 stdout 的最后一行是Jar Jar
。
另一个结果是_
可以用于其他参数扩展,例如命令序列
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
印刷isomorphism isosceles
。但没有类似的“ ${!$%morphism}
”扩展。
有关 Bash 中扩展阶段的更多信息,请参阅EXPANSION
(man 1 bash
这称为外壳扩展在网络版中)。该HISTORY EXPANSION
部分是单独的。
答案2
严格来说!$
是历史列表中最后一个命令的最后一个字。
word - 被 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
command 来查找之前使用过的命令的历史记录...尝试一下...
注意:对于特定用户,之前使用的所有命令都将存储在 bash 历史文件下。