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

问题描述 投票:22回答:3

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

EG

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

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

bash syntax symbols
3个回答
34
投票

这是上一个命令的最后一个参数。来自documentation

!!:$

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

备注。如果你想玩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 ;

还有许多其他例子,例如带有别名。


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

随着$_

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

0
投票

猴子的答案:

whit!$你可以轻松打印上一个命令的最后一个单词

#Create new file
touch newfile.txt
#Edit new file using !$ instead newfile.txt again
nano !$
© www.soinside.com 2019 - 2024. All rights reserved.