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