bashのコマンド履歴と便利な再実行の方法

多くのLinuxディストリビューションやmacOSなど、デフォルトのログインシェルとして広く採用されているbashには過去に実行したコマンドのヒストリー(履歴)機能が搭載されています。

このbashのヒストリー機能について便利な使い方を紹介します。

コマンドのヒストリー機能について

一覧表示

一覧表示はhistoryコマンドで行う事ができます。(historyはbashの組込コマンドです)

コマンド履歴の保存件数はデフォルトで1000件となっている環境が多いですが、環境変数のHISTFILESIZEで指定する事ができます。

$ history |head
    1  su
    2  ls -la /usr/local/libexec/gcc/i686-pc-linux-gnu/5.3.0/
    3  cd
    4  su
    5  vi soft/run_make.gcc 
    6  ldd /usr/local/libexec/gcc/i686-pc-linux-gnu/5.3.0/cc1
    7  ldd /usr/local/libexec/gcc/i686-pc-linux-gnu/4.8.5/cc1
    8  sudo su
    9  ls -la /usr/local/libexec/gcc/i686-pc-linux-gnu/5.3.0/
   10  sudo su

※例ではheadコマンドにパイプして先頭の10件だけ表示させています。

ヒストリー番号での再実行

historyコマンドで表示されたコマンド履歴の先頭の番号でコマンドを再実行することが可能です。

例えば番号100の履歴が「uname -a」だとして再実行するには以下のように「!番号」を指定します。

$ !100
uname -a
Linux yggdrasill 4.14.149-1-fit-pc2 #2 SMP Tue Oct 15 17:01:19 JST 2019 i686 GNU/Linux

最近実行したコマンドの再実行

直前のコマンドであれば以下のように「!!」を指定します。

$ uptime
 23:39:15 up 22:45,  1 user,  load average: 0.04, 0.10, 0.09
再実行
$ !!
uptime
 23:39:24 up 22:45,  1 user,  load average: 0.03, 0.09, 0.08

直近で使用した「v」で始まるコマンドを再実行するには以下のように「!v」を指定します。

$ vi hoge
$ vi fuga
$ uptime
 23:44:36 up 22:50,  1 user,  load average: 0.02, 0.11, 0.09
直近に使用した「v」から始まるコマンドを再実行
$ !v
vi fuga

コマンド履歴を検索して再実行

Ctrl + rキーを押すとプロンプトが変わり履歴を検索して実行することができます。

先頭から1文字ずつ入力していくごとにマッチする履歴が表示されます。

表示がかわっていき目的のコマンドが表示されたらエンターを押して実行することができます。

またはエスケープキーや左右の方向キーを押して検索プロンプトを解除して、表示されている履歴を編集することもできます。

Ctrl + R を押す
(reverse-i-search)`':
文字を入力(vを入力)
(reverse-i-search)`v': sudo vi /etc/resolv.dnsmasq
文字を入力(vi /etc/aまで入力)
(reverse-i-search)`vi /etc/a': vi /etc/apt/apt.conf

まとめ

bashの組込コマンドhistoryには履歴の表示機能の他にも以下のようなオプションがあります。

  • 履歴の消去(-c)
  • 履歴番号を指定して消去(-d)
  • 履歴をファイルへ書き出し(-w)
  • 履歴をファイルへ追記(-a)
  • 履歴をファイルから読込み(-r)

※上記機能の動作は現在のセッションの履歴との関係に注意する必要があります。

※bashの組込コマンドであるhistoryの詳しい説明は「man bash」を参照して下さい。