什么是Bash的爆炸美元(!$)?

Sno*_*ash 25 syntax bash symbols

Bang dollar似乎是指最后一个命令行的最后一部分.

例如

$ ls -l
 .... something
$ !$
-l
bash: -l command not found
Run Code Online (Sandbox Code Playgroud)

我可以在美元变量上找到很多(例如$!)但不是这个.任何解释?

gni*_*urf 36

这是上一个命令的最后一个参数.从文档:

!!:$

指定前一个命令的最后一个参数.这可以缩短为!$.

备注.如果你想玩Bash的历史,我建议你打开shell选项,histverify如下所示:

shopt -s histverify
Run Code Online (Sandbox Code Playgroud)

(你也可以把它.bashrc永久地放在你身上).使用历史替换时,替换不会立即执行; 相反,它被放入readline的缓冲区,等待你按下输入......或者不是!


为了使事情准确,键入!$不等于键入"$_":!$实际上是历史替换,指的是输入的上一个命令最后一个字,而是"$_"先前执行的命令的最后一个参数.你可以比较两者(我有shopt -s histverify):

$ { echo zee; }
zee
$ echo "$_"
zee
$ { echo zee; }
zee
$ echo !$
$ echo }
Run Code Online (Sandbox Code Playgroud)

也:

$ if true; then echo one; else echo two; fi
one
$ echo "$_"
one
$ if true; then echo one; else echo two; fi
$ echo !$
$ echo fi
Run Code Online (Sandbox Code Playgroud)

并且:

$ echo zee; echo "$_"
zee
zee
$ echo zee2; echo !$
$ echo zee2; echo "$_"
Run Code Online (Sandbox Code Playgroud)

并且

$ echo {1..3}
1 2 3
$ echo "$_"
3
$ echo {1..3}
1 2 3
$ echo !$
$ echo {1..3}
Run Code Online (Sandbox Code Playgroud)

并且

$ echo one ;
$ echo "$_"
one
$ echo one ;
one
$ echo !$
$ echo ;
Run Code Online (Sandbox Code Playgroud)

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

  • ...但仅在*交互*模式下工作!!:比较 `bash -c $'echo hello world\necho !$'` 与 `bash -c $'echo hello world\necho $_'` ... *我有一个“快乐”,我有一个“新年”,啥!“新年快乐!”*,@gniourf_gniourf! (2认同)

zee*_*zee 6

!$可以做什么$_,除了$_不存储它返回的值(作为其替换)的事实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
Run Code Online (Sandbox Code Playgroud)

$_

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$ 
Run Code Online (Sandbox Code Playgroud)

更多的选择:

!^      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
Run Code Online (Sandbox Code Playgroud)

  • 从技术上讲,`!$`和`$ _`**不是**相同.`!$`在更高级别上行动.您可以看到别名,复合命令或多个命令的差异.在以下情况下将`echo!$`与`echo $ _`进行比较:1.``echo zee; }`; 2.如果是真的; 然后回声一个; 否则回声二; fi`; 3.同时输入两个命令,例如`echo zee; echo $ _`和`echo zee2; echo $!`. (3认同)