curluneの日記

日々試行錯誤。雑多に、気ままに、てきとーに。HoloLens/Oculus Rift,Touchと戯れる日々。

bashのヒストリーのショートカット辺りのお話 ひとりぷちアドベントカレンダー2017 02日目

昨日に引き続きbash周り、今回はヒストリーについてのお話です。 historyという、ズバリな内部コマンドがありますが、今回はそちらは省略で。

これだけ覚えておくとべんり

  • Ctrl+rでヒストリ検索開始
  • 探したい文字列を入力して過去方法へインクリメンタル検索
  • Esc > 過去へ行き過ぎたら振り出しに戻る (Esc を押した後に >を入力)

ヒストリー

bash(に限らないですが)では、以前に実行したコマンド確認、再実行できる仕組みがあります。 カーソルの上下で以前の入力が出てくるあれです。 これを利用することで入力の手間を軽減できます。

素早く探す

履歴は検索を利用する事で素早く取り出す事ができます。

直近に利用した物であれば、カーソルの上下(or Ctrl+p, Ctrl+n)でも十分です。けれども、しばらく前のものを実行する場合は検索した方がらくちんです。

Ctrl+rを入力するとインクリメンタル検索が始まります。

(reverse-i-search)`':

この状態で文字を入力すると、入力した通りの内容が含まれる行が表示されます。 あとはエンターで実行か、Esc or 左右のカーソルで検索モードを終わりにして編集する事ができます。

分かりにくい動作

便利な機能ですが、見つからなかった時の動作がとてもにくいです... 次のこと覚えておくと良いと思います。

  • 該当行が見つかったらそこまで上キーのみの連打(をしたような状態になる)
  • 該当行が見つからなかったら画面は何もかわらない
    • けれども、内部的な検索文字列は入力全てを持っている。

検索例

下記のような履歴の時の動作を説明します。 下の行ほど新しい(最近の)履歴です。 pushdを実行した後の状態からスタートです。

#履歴 数字は行番号
10000  cd
10001  pwd
10002  echo
10003  pushd
10004
$ 
#`Ctrl+r`で検索を開始
(reverse-i-search)`':
#`c`を入力
#下から順に`c`を含む行をさがす
#見つかったので10002行目まで上キー連打
(reverse-i-search)`c': echo
#`o`を入力
#該当が無いので何も変わらない
#けれども検索中の文字は`co`
(reverse-i-search)`c': echo
#`p`を入力
#検索中の文字は`cop`
(reverse-i-search)`c': echo
#バックスペースを入力
#検索中の文字は`co`
(reverse-i-search)`c': echo
#バックスペースを入力
#検索中の文字は`c`
#`c`を含む物が見つかったので上連打
(reverse-i-search)`c': cd
# `Esc`を入力
#検索終了
# 開始時の状態から10000行目まで上キー連打と同じ状態
$ cd

該当がなかった場合には表示は変わらず検索文字だけ変わっている、という動作...

戻りすぎてしまったとき

検索は最近から過去への一方向です。 そのため戻りすぎた場合は現在地?を未来分に進める、つまりは下キー連打が必要です。また、連打の代わりにEsc > の順に入力することで一気に最新分に戻れます。

実のところ未来方向への検索も存在するのですが、下準備をしないと利用できません。Esc >で事足りるので忘れてしまいましょう。

履歴に関する設定

履歴に残す条件や履歴の最大保持件数など、いくらかの項目については変数を通して設定を行うことができます。 .bash_profile辺りに HISTSIZE=大きな数字を追加して保存数を増やしておくと、より活用しやすくなります。

おわりに

分かりにくい部分もありますが、慣れてしまえば大丈夫。 履歴検索を使って楽をしましょう。

その他いろいろについてはマニュアルへ!

Man page of BASH