[bash] 历史命令的查看、编辑与执行
在 Bash 中,通过上/下方向键可以快速遍历历史命令,并执行。
但是,如果历史命令过多,或期望执行的历史命令不是最近执行的,那么,通过上/下查找历史命令将不再变得易用。
使用 history
查看历史命令
Bash 内置的 history
命令可以列出若干最近执行的命令。就像下面这样:
$ history
7 ps aux
8 pwd
9 cd x
10 sudo -i
11 cd ..
387 go run main.go
420 git status
498 git branch
500 git pull origin master
上面的输出内容省略了很多,通常有好几百行。直接肉眼寻找历史命令肯定不合适,所以通常结合 grep
使用。
$ history | grep client
269 ./bin/client --server=***:4430 --listen=localhost:1080
270 ./bin/client --server=***:4430 --listen=localhost:1080
276 ./make_client.sh
509 history | grep client
这样一来,基本上能很快定位到需要的历史命令上。
执行历史命令
注意到前面 history
命令输出的历史命令前面都有一个对应的数值,它是该历史记录的编号。
通过 !编号
的方式即可以执行该命令。
$ !8
pwd
/Users/tao/posts
编辑并执行历史命令
很多时候我们可能需要找到某个历史命令,编辑之后再执行(比如修改某个参数)。上面提到的方式并不能编辑命令,按下回车后就执行了。
如果需要先编辑再执行,那么,可以在其后面追加一个 :p
修饰符。
加上此修饰符后,Bash 会打印此命令的内容,并将其作为最近一条历史命令。使用上即可编辑该命令,编辑完后,回车执行。
总是先编辑再执行命令
如果觉得上面的操作有些麻烦,可以修改一下 bash 提供的一个名为 histverify
的参数为 on
。此后所有的命令在被执行前都会先进入编辑模式,而不是直接执行。
$ # 查看当前值
$ shopt histverify
histverify off
$
$ # 设置默认打开
$ shopt -s histverify
$
$ # 关闭默认编辑
$ shopt -u histverify
在该参数打 on
时,每次执行历史命令前都会先进入编辑模式。编辑命令,执行命令。
使用 fc
命令在编辑器中编辑最后一条命令
如果命令太长,在 bash 的行编辑模式下不方便编辑,可以使用 fc
命令进入到编辑器中编辑该命令(该编辑器默认是 vim),编辑完成后,保存并退出编辑器即可执行此(长)命令。