在Bash中,什么是bang dollar(!$)?

40

铿元似乎指的是上一个命令行的最后一部分。

例如:

$ ls -l
 .... something
$ !$
-l
bash: -l command not found

我可以找到很多有关于美元变量的内容(例如$!),但却找不到关于这个的。有什么解释吗?


! 通常与历史命令有关。 - user2864740
2
根据这个回答,它是前一个命令的最后一个参数。 - user000001
3个回答

66

这是前一个命令的最后一个参数。根据文档

!!:$

表示先前命令的最后一个参数。可以缩写为!$

备注。 如果您想尝试Bash的历史记录,请打开shell选项histverify,方法如下:

shopt -s histverify

(您还可以将其放在您的.bashrc中,以便永久拥有它)。使用历史替换时,替换不会立即执行;相反,它被放置在readline缓冲区中,等待您按下回车键...或者不按!


要精确地说,键入 !$ 并不等同于键入"$_" !$ 是一个历史替换,指的是上一次输入的先前命令的最后一个单词。,而"$_"是先前执行命令的最后一个参数。您可以进行比较(我使用了shopt -s histverify):

$ { echo zee; }
zee
$ echo "$_"
zee
$ { echo zee; }
zee
$ echo !$
$ echo }

还有:

$ if true; then echo one; else echo two; fi
one
$ echo "$_"
one
$ if true; then echo one; else echo two; fi
$ echo !$
$ echo fi

还有:

$ echo zee; echo "$_"
zee
zee
$ echo zee2; echo !$
$ echo zee2; echo "$_"

还有

$ echo {1..3}
1 2 3
$ echo "$_"
3
$ echo {1..3}
1 2 3
$ echo !$
$ echo {1..3}

还有

$ echo one ;
$ echo "$_"
one
$ echo one ;
one
$ echo !$
$ echo ;

还有许多其他示例,例如使用别名。


感谢这些出色的示例......因此两者共享公共函数,但它们并不相同。 - z atef
@zee:确实,它们并不在同一水平上。 - gniourf_gniourf
1
++ 为一组很好的示例。 - Inian
2
...但只能在交互式模式下工作!!:比较bash -c $'echo hello world\necho !$'bash -c $'echo hello world\necho $_'... 我有一个“快乐”,我有一个“新年”,汉!“新年快乐!”,@gniourf_gniourf! - F. Hauri - Give Up GitHub
@F.Hauri:当然,这是关于_历史扩展_的问题。 - gniourf_gniourf

11

!$可以做$_所能做的事情,除了$_不能将其返回值(作为其替换项)存储到history中。

以下是一个示例。

使用!$

za:tmep za$ ls -lad 
drwxr-xr-x  4 za  staff  136 Apr  6  2016 .
za:tmep za$ !$
-lad
-bash: -lad: command not found
za:tmep za$ history | tail -n 3
  660  ls -lad 
  661  -lad                     <<== history shows !$ substitution.  
  662  history | tail -n 3

使用$_

za:tmep za$ ls -lad
drwxr-xr-x  4 za  staff  136 Apr  6  2016 .
za:tmep za$ $_
-bash: -lad: command not found
za:tmep za$ history | tail -n 3
  663  ls -lad
  664  $_         <<== history shows $_ and not its substitution. 
  665  history | tail -n 3
za:tmep za$ 

更多选项:

!^      first argument
!:2     second argument
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments
!:2-3   second to third arguments
!$      last argument
!*      all arguments

6
从技术上讲,!$$_ 不是 同一个东西。!$ 在更高的层面上起作用。您可以在别名、复合命令或多个命令中看到其中的区别。在以下情况下比较 echo !$echo $_:1. { echo zee; }; 2. if true; then echo one; else echo two; fi; 3. 还要键入两个命令,例如 echo zee; echo $_echo zee2; echo $! - gniourf_gniourf

1
猴子的回答:
使用 "!" 可以轻松打印出上一个命令的最后一个单词。
#Create new file
touch newfile.txt
#Edit new file using !$ instead newfile.txt again
nano !$

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接