bashの履歴展開を堪能する

最近、コマンド履歴の達人を目指していたが、未だ成れずじまい。少年とは言わないが、老いやすく、達人成りがたし...である。コマンドを知るほどに、倍返し*1で新たな知らないことに気づく。

さあ、ターミナルを開いて、コマンドを入力する準備が整った。bashの履歴展開を堪能してみる。

  • 以下のようなコマンド履歴状態だったとする。
$ history 5
  415  echo "'私は'zarigani\'s tosh'です。'"|sed -E "s/(^|[^\])'/\1/g"
  416  history|open -a console
  417  history 10
  418  mate /Users/bebe/Documents/text-spacing/text-spacing.rb.sh 
  419  history 5

実行しないで、表示だけする

  • !415でreturnしてしまうと、コマンドが実行されてしまうが、
  • コロン:で区切ってpを指定すると実行されずに、履歴番号の内容を表示してくれる。
$ !415:p
echo "'私は'zarigani\'s tosh'です。'"|sed -E "s/(^|[^\])'/\1/g"

任意の引数を選択する

  • !415:0:p、!415:1:p、!415:2:p、!415:3:p、と実行してみた。
$ !415:0:p
echo

$ !415:1:p
"'私は'zarigani\'s tosh'です。'"

$ !415:2:p
$ !415:3:p sed
  • つまり、415履歴の、n番目の引数を、表示する、という意味なのだ。
  • $は、末尾を意味する。
  • ^は、先頭を意味する。
$ !415:$:p
"s/(^|[^\])'/\1/g"

$ !415:^:p
"'私は'zarigani\'s tosh'です。'"
  • すべての引数(コマンドを含まない)
$ !415:*:p
"'私は'zarigani\'s tosh'です。'" | sed -E "s/(^|[^\])'/\1/g"
  • 3番目以降のすべての引数
$ !415:3*:p
sed -E "s/(^|[^\])'/\1/g"
  • 0番目から2番目の引数(0番目はコマンド)
$ !415:-2:p
echo "'私は'zarigani\'s tosh'です。'" |
  • 3番目から4番目の引数
$ !415:3-4:p
sed -E

置き換え

$ !415:s/sed/perl/:p
echo "'私は'zarigani\'s tosh'です。'"|perl -E "s/(^|[^\])'/\1/g"

直前のコマンド

  • 直前のコマンドを表示する。
$ !!:p
history 5

ファイルパス自由自在

  • 418履歴を表示する。(TextMateで開くコマンド)
$ !418:p
mate /Users/bebe/Documents/text-spacing/text-spacing.rb.sh 
  • 418履歴の最後の引数
$ !418:$:p
/Users/bebe/Documents/text-spacing/text-spacing.rb.sh
$ !418:$:h:p
/Users/bebe/Documents/text-spacing
  • 418履歴の最後の引数のファイルの部分(tail側)
$ !418:$:t:p
text-spacing.rb.sh
  • 418履歴の最後の引数のファイルの部分の拡張子なし(.shを削除)
$ !418:$:t:r:p
text-spacing.rb
  • 418履歴の最後の引数(ファイルパス)の拡張子なし(.shを削除)
$ !418:$:r:p
/Users/bebe/Documents/text-spacing/text-spacing.rb
  • 418履歴の最後の引数(ファイルパス)の拡張子のみ(.sh以外を削除)
$ !418:$:e:p
.sh

簡易置き換え

$ ls /Users/bebe/Documents/text-spacing
.git/                    text-spacing-none.rb.sh  text-spacing.rb.sh       text-spacing_text.txt
  • 直前のlsコマンドをcdコマンドに置き換えて実行するなら、この方法が便利。
$ ^ls^cd^
cd /Users/bebe/Documents/text-spacing
.git			text-spacing-none.rb.sh	text-spacing.rb.sh	text-spacing_text.txt

man bash

  • bashのコマンド履歴のすべてはMan page of BASHに書いてあった。
  • コマンド履歴に興味を持ってから読むと、10倍効率よく頭に入りそう。

*1:コマンドの世界にはNAOKIが居るのか?