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履歴の、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
ファイルパス自由自在
- 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履歴の最後の引数のディレクトリの部分(head側)
$ !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したディレクトリにcdしたいとか、たまにある。
$ 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倍効率よく頭に入りそう。