bashの履歴展開

最初にUNIXを触ったのは10数年前で、そのUNIXがどんなものだったかもシェルが何というものだったかも知らずに使ってたんですが、とにかくその時使っていた環境には、シェルにreadlineはありませんでした。

何で当時は、"!"で履歴展開をよく使ってました。今はCTRL-Pがあるのであまり使わないんですが、久しぶりにどんな風に使っていたか思いだしてみようと思います。たまには役に立つかもしれません。

直前のコマンドをもう一度実行

$ !!                 # 直前のコマンドを実行
$ !-1                # 履歴の1つ前を実行
$ history
...
 1028  cd /tmp/
 1029  ls
 1030  pwd
 1031  pwd
 1032  pwd
 1033  history
 1034  ls -l
 1035  pwd
 1036  ls -l
 1037  history
$ !1036              # 履歴の1036番目を実行
$ !ls                # 直前のlsを実行
ls -l
...

履歴の一部を展開

$ vim foo/bar/baz.txt
...
$ git status !:1      # 直前のコマンドの第一引数に展開
git status foo/bar/baz.txt
# On branch master
...
$ cp !vim:1 !vim:1:s/txt/txt.orig/       # 直前のvimコマンドの第一引数の"txt"を"txt.org"に置換して展開
cp foo/bar/baz.txt foo/bar/baz.txt.orig
$ ls -l !cp:$         # 直前のcpコマンドの最後の引数に展開
ls -l foo/bar/baz.txt.orig
$ cd !cp:$:h          # 直前のcpコマンドの最後の引数のディレクトリ部分に展開
cd foo/bar