2016/10/18 20:29:02

[bash]コマンド履歴を検索して利用する

目次(クリックするとジャンプします)
  • 1:コマンド打つのがダルい勢
  • 2:検索モード
  • 2.1:履歴の検索
  • 2.2:履歴を遡る
  • 2.3:途中の文字でも検索可能
  • 2.4:条件に合致しない場合
  • 3:補足・ハマったポイント
  • 3.1:ctrl+sを無効にする
  • 4:まとめ

コマンド打つのがダルい勢

@MINOはコマンドをなるべく打ちたくありません。そのためコマンド履歴を結構使います。

シェルコマンドの履歴を確認するコマンドとしてはhistroyコマンドがあります。便利ではあるのですが、目的の履歴にたどり着くには意外と時間が掛かる場合もあります。

そこで入力補完で履歴を検索してくれるctrl+rがとても便利です。

検索モード

ctrl+rはbashの検索モードという機能を立ち上げるキーバインドです。過去に実行したコマンドをオムニ補完で絞り込んで表示してくれます。

使い方はとても簡単なのでぜひどうぞ。

履歴の検索

ctrl+rを押すとコマンドラインが以下のような表示に変わります。

(reverse-i-search)`':

そこで過去に実行したsshコマンドを探したいとします。

sshと打つと…

(reverse-i-search)`ssh': ssh -p22 -i ~/.ssh/id_rsa mino@hoge 

このように直近のsshコマンドを検索再現してくれます。

enterキーを押すと、そのままその履歴コマンドが実行されます

(reverse-i-search)`ssh': ssh -p22 -i ~/.ssh/id_rsa mino@hoge 
enterキー押
Enter passphrase for key '/home/pecodrive/.ssh/mackerel_rsa':

もしすこしコマンド内容を変えたい時は右カーソルキーを押すと、そのコマンドがコマンドラインに入った状態になります。

(reverse-i-search)`ssh': ssh -p22 -i ~/.ssh/id_rsa mino@hoge
右カーソルキー押
$ ssh -p22 -i ~/.ssh/id_rsa mino@hoge 

あとは煮るなり焼くなり好きにできマス。

履歴を遡る

複数のコマンド履歴がある場合はctrl+rを再度押して履歴を進めます。

例えば以下のようなコマンド履歴があった場合

ls
ls -al
ls -al /etc

ctrl+rを押すごとに以下のように履歴が遡られます。

(reverse-i-search)`ls': ls -al /etc
ctrl+r
(reverse-i-search)`ls': ls -al 
ctrl+r
(reverse-i-search)`ls': ls 

ctrl+sを押すと履歴を進みます。

ctrl+r
(reverse-i-search)`ls': ls -al /etc
ctrl+r
(reverse-i-search)`ls': ls -al 
ctrl+r
(reverse-i-search)`ls': ls 
ctrl+s
(reverse-i-search)`ls': ls -al 
ctrl+s
(reverse-i-search)`ls': ls -al /etc

途中の文字でも検索可能

途中の文字でも検索できます。

(reverse-i-search)`al': ls -al /etc
(reverse-i-search)`al': ls -al 

でも正規表現等には対応していません…。正規表現使えたらいいな…。

条件に合致しない場合

もし条件に合致した履歴がない場合は以下の様にfailedとなります。この場合一応履歴が表示されますが、前回合致した履歴が表示されるようです。

(failed reverse-i-search)`w': ls -al /etc

補足・ハマったポイント

ctrl+sを無効にする

ctrl+rと併用することのあるctrl+sですが、多くの場合「端末ロック」という機能にキーバインドされているため、画面がロックしてしまうという面倒な状態になってしまう場合があります。

端末ロックしてしまった場合はctrl+qで復帰できマス。

端末ロックを積極的につかっていないならキーバインドを外す手もあります。

sttyコマンドを使ってctrl+sの割り当てを確認してみましょう。

$ stty -a

speed 38400 baud; rows 41; columns 151; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
~~
~~

出力された情報のなかにstop = ^Sがあったらctrl+sが端末ロックにバインドされている状態です。

$ stty stop undef
$ stty -a

speed 38400 baud; rows 41; columns 151; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = <undef>; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
~~
~~

さっきのstop = ^Sstop = <undef>になってのが確認できるかと思います。これでctrl+sは端末ロックからアンバインドされました。

もし元に戻したい場合は以下のようにもう一度バインドします。^がctrlを表します。

$ stty stop ^s
$ stty -a

speed 38400 baud; rows 41; columns 151; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
~~
~~

もちろん別なキーにバインドすることも可能なので、お好みの状態を作ってみてください。

まとめ

  • bashはctrl+rでコマンド履歴を検索する「検索モード」に以降する。
  • histroyコマンドも便利だが検索モードも便利
  • 残念ながら正規表現などは使えない…
  • ctrl+sは端末ロックのキーバインドなので注意