history – シェルのコマンド履歴で効率UP!

Linuxに限らず、端末(ターミナル)からコマンドライン(CLI)でコンピュータを操作していると、少し前に入力したコマンドを再度入力しなければならないことがよくあります。長いコマンドを入力ミスして実行してしまった場合などは、ほんの一部を修正して再度実行しなければなりません。
このような場合に非常に役立つ、Linuxのシェルで使えるヒストリ(コマンド履歴)機能について紹介します。ヒストリ機能は、過去に実行したコマンドの履歴を管理し、再利用するための強力なツールといえます。
本稿では、Ubuntu 24.04の bash 環境で検証しました。

対話的にヒストリを編集するには

bash 等のシェルでは、入力されたコマンドの履歴をヒストリ・リストとして管理しています。ヒストリ・リストを対話的に出力する最も簡単な方法は、方向キーの[↑][↓]を使用する方法です。

具体的には、「history」というコマンドを「histry」と入力してしまったとします。

$ histry
histry: コマンドが見つかりません
$

ここで[↑]を押すとひとつ前のコマンドが表示されます。

$ histry
histry: コマンドが見つかりません
$ histry

続いて[←]を2回押して[o]を入力してみてください。

$ histry
histry: コマンドが見つかりません
$ history

カーソルは[o]の次ですが、かまわずそのまま、[Enter]キーを押します。

   <省略>

  161  PS1='$ '
  162  histry
  163  history
$

正しく「history」コマンドが実行されました。

以下が方向キーの機能のまとめです。方向キーの代わりに、emacs というエディタのキーコンビネーションも使用できます。

キーキーコンビネーション機能
[Ctrl]+[p]一つ前のコマンド
[Ctrl]+[n]一つ先のコマンド
[Ctrl]+[f]カーソルを右に移動
[Ctrl]+[b]カーソルを左に移動

ヒストリを検索するには

過去実行したコマンドを検索して実行することができます。
[Ctrl]+[r]とタイプしてみてください。

(reverse-i-search)`':

プロンプトが上のように変わります。これはインクリメンタル検索による過去コマンドの呼び出しモードが有効になったことを表しています。ここから入力された文字列と一致するコマンドが検索されます。

ここで、コマンドヒストリが以下の状態で、159の
「shutdown -h 0」
を実行したい場合の手順は次の通りです。

  158  vi .bashrc
  159  shutdown -h 0
  160  history
  161  PS1='$ '
  162  histry
  163  history
[Ctrl]+[r]と入力して検索モードにし、[s]を入力します。するとコマンドラインが、以下のように表示されます。

(reverse-i-search)`s': history

これは、入力された文字[s]がヒストリの新しいものから順に検索され、一致するコマンドがリアルタイムに表示された結果です。
次に[h]と入力します。すると今度は、「sh」と一致するコマンドが検索されます。

(reverse-i-search)`sh': shutdown -h 0

上の状態で[Enter]を押すと「shutdown -h 0」コマンドが実行されます。
「sh」にマッチする次の候補を検索したい場合は、再度[Ctrl]+[r]を入力します。

ちょっとした応用例

上の検索方法では、候補が1パターン表示されるだけです。検索文字列にマッチするすべての候補を表示するには、次の方法が考えられます。

history | grep 検索文字列

上はコマンド履歴を表示する history コマンドの出力結果から、grep コマンドで検索して表示しています。
上記の応用例として、過去実行したコマンドを検索できるコマンドを alias で作成してみます。
以下のようになります。

alias hg='history | grep -e'
  • コマンド名
    hg ー コマンド履歴を指定した文字列で検索し、結果を表示する
  • 使い方
    hg 検索文字列
    hg 検索文字列 -e 検索文字列(ORで検索)

使用例1

systemctl の使用履歴を検索します。

$ hg systemctl
   35  systemctl list-units -t service| grep running
  181  hg systemctl

使用例2

シェルの for 文を対話的に入力して実行したケースを検索します。空白を含む検索パターンなので、引数をシングルクォートで囲みます。

$ hg 'for i'
   77  for i in 1 2 3 4; do echo $i; done
  173  hg 'for i'

使用例3

netstat と locale のいずれかを含む履歴を検索します。-e オプションは grep コマンドでOR検索をする際のオプションです。

$ hg netstat -e locale
   16  sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
   17  soure /etc/default/locale
  105  netstat -nltu
  106  netstat -nltup
  113  netstat -nltu
  182  hg netstat -e locale