[bash] 历史命令的查看、编辑与执行

陪她去流浪 桃子 2018年02月03日 编辑 阅读次数:2284

在 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),编辑完成后,保存并退出编辑器即可执行此(长)命令。

参考

put history command onto command line without executing it

标签:Bash