Bash 中的 bang 美元 (!$) 是啥?
Posted
技术标签:
【中文标题】Bash 中的 bang 美元 (!$) 是啥?【英文标题】:What is bang dollar (!$) in Bash?Bash 中的 bang 美元 (!$) 是什么? 【发布时间】:2017-05-14 02:13:04 【问题描述】:Bang Dollar 似乎指的是最后一个命令行的最后一部分。
例如
$ ls -l
.... something
$ !$
-l
bash: -l command not found
我可以在美元变量上找到很多(例如$!
),但在这个上找不到。有什么解释吗?
【问题讨论】:
!
通常/经常与历史命令相关。
根据this answer,是上一条命令的最后一个参数
【参考方案1】:
猴子的回答:
whit !$ 您可以轻松打印上一条命令的最后一个单词
#Create new file
touch newfile.txt
#Edit new file using !$ instead newfile.txt again
nano !$
【讨论】:
【参考方案2】:!$
可以做$_
所做的事情,除了$_
不会将它返回的值(作为它的替代)存储到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
【讨论】:
从技术上讲,!$
和 $_
不相同。 !$
作用于更高的层次。您可以使用别名、复合命令或多个命令查看差异。在以下情况下比较echo !$
和echo $_
: 1. echo zee;
; 2.if true; then echo one; else echo two; fi
; 3. 同时输入两个命令,例如echo zee; echo $_
和echo zee2; echo $!
。【参考方案3】:
这是上一个命令的最后一个参数。来自documentation:
!!:$
指定前面命令的最后一个参数。这可以缩短为
!$
。
备注。如果你想玩转 Bash 的历史,我建议你打开 shell 选项histverify
,如下所示:
shopt -s histverify
(您也可以将其放入您的.bashrc
以永久启用)。使用历史替换时,不会立即执行替换;相反,它被放入了 readline 的缓冲区,等待你按 enter... 或不!
为了准确起见,输入!$
不等于输入"$_"
:!$
实际上是一个历史替换, 指的是上一个命令的最后一个字已输入, 而"$_"
是先前执行 命令的最后一个参数。你可以比较两者(我有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 ;
还有很多其他示例,例如,使用别名。
【讨论】:
^1 是很好的例子.....所以它们都有共同的功能,但它们并不相同。 @zee:确实,他们并没有真正处于同一水平。++
的例子很好。
... 但只能在 interactive 模式下工作!!:比较 bash -c $'echo hello world\necho !$'
与 bash -c $'echo hello world\necho $_'
... 我有一个“快乐”,我有一个“过年”,汗! “新年快乐!”,@gniourf_gniourf!
@F.Hauri:当然,这是关于历史扩展的。以上是关于Bash 中的 bang 美元 (!$) 是啥?的主要内容,如果未能解决你的问题,请参考以下文章