!-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。