在阅读脚本内容时,我发现类似这样的内容:
echo "An Example" > !$
所以我想知道!$
bash 中的意思是什么。
答案1
来自man bash
(第 3813 行之后的某个地方):
! Start a history substitution, except when followed by a blank, newline, carriage return, = or ( (when the extglob shell option is enabled using the shopt builtin). [...] $ The last word. This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.
因此,!$
将从历史记录中调用最后一条命令的最后一个参数。
以下是一些示例和等价物:
$ echo foo bar
foo bar
$ echo !$ # recall the last argument from the last command from history
echo bar
bar
$ echo foo bar
foo bar
$ echo !:$ # the same like `!$'
echo bar
bar
$ echo foo bar
foo bar
$ echo !:2 # recall the second (in this case the last) argument from the last command from history
echo bar
bar
$ echo foo bar
foo bar
$ echo $_ # gives the last argument from the last command from history
bar
$ echo foo bar
foo bar
$ echo Alt+. # pressing Alt and . (dot) in the same time will automatically insert the last argument from the last command from history
bar
$ echo foo bar
foo bar
$ echo Alt+_ # the same like when you press Alt+.
bar
$ echo foo bar
foo bar
$ echo Esc. # the same like when you press Alt+.
bar
所有这些都只能在交互式外壳。但是如果你在脚本中使用问题中的命令,就像你说的那样,那么事情就不同了:当你运行脚本时,它将在一个新的 shell 中启动,一个非交互式shell,所以历史扩展在这种情况下没有任何效果,因此命令:
echo "An Example" > !$
!$
如果不存在则创建文件(否则覆盖它)并写入An Example
其中。
答案2
我发现 !$ 意味着最后一个参数举个例子:
touch /tmp/file1
这里的论点是/tmp/文件1, 所以!$/tmp/file1
在回声示例中被替换。
如果您输入该命令du -b !$
,则输出将是磁盘使用情况(以字节为单位)/tmp/file1