!$ 是什么意思?

!$ 是什么意思?

我正在阅读一个教程,它提到运行此命令:

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 Enter echo !$ Jar Enter Up Enter;和

  • echo Foo Enter echo $_ 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 中扩展阶段的更多信息,请参阅EXPANSIONman 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

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

您还可以通过使用historycommand 来查找之前使用过的命令的历史记录...尝试一下...

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

相关内容