Liping's Blog

翁曰:「無他,但手熟爾。」

bash引用命令参数

!-n

引用之前输入过的命令,比如!-1代表上一个命令,!-2代表上上个命令

$ echo "hello world!"
hello world!
$ cd
$ !-2  # !-1 is "cd" and !-2 is 'echo "hello world!"'
$ echo "hello world"
hello world

!! 等价于!-1

$ echo "hello world!"
hello world!
$ !!
$ echo "hello world"
hello world

!! 在sudo的时候比较有用

$ vim /etc/myfile
vim: /etc/myfile: Permission denied
$ sudo !!
$ sudo vim /etc/myfile

引用之前输入过的命令的参数

!^ 代表上次输入命令的第一个参数,!$ 代表上次输入命令的最后一个参数,!!:n 代表上次输入命令的第n个参数

$ touch first.txt second.txt last.txt
$ vim !!:2
$ vim second.txt

当然,如上面介绍,!! 可以换成 !-n 代表上几个命令。

如果是引用上次输入命令的参数,还有一种快捷键方式

yank-nth-arg (M-C-y) 引用上次输入命令的第n个参数,具体操作是M-n M-C-y
yank-last-arg (M-., M-_) 引用上次输入命令的最后一个参数。

扩展命令(重点)

虽然上面的的替换好用,但万一替换错了就麻烦了,所以最好把替换的命令转成最终的命令。bash默认支持几种扩展:

shell-expand-line (M-C-e) 扩展所有
history-expand-line (M-^) 扩展历史,就是上面提到的
glob-expand-word (C-x *) 扩展*?之类的

更多信息,请参考Bash Reference Manual

本文参考Shell productivity tips and tricks,可以点击链接前往原文查看更多tips and tricks。

Comments