コマンド履歴を再利用する目的と仕組み
Linuxのシェル(bash / zsh)は、実行したコマンドを ~/.bash_history などのファイルに記録しています。同じコマンドを何度も手入力しているなら、履歴を検索して呼び出すだけで手間を大幅に減らせます。
特に効果があるのは次のような場面です。
- 長いオプションを伴う
find・rsync・curlコマンドを繰り返す - サービス再起動や設定リロードを何度も行う
- 「さっき動いたコマンドを再現したい」という場面
historyコマンドで過去の操作を一覧表示する
まず基本として、history コマンドで過去に実行したコマンドの一覧を番号付きで表示できます。
history
件数が多い場合は grep と組み合わせてキーワードで絞り込めます。
history | grep systemctl
出力例は次のようになります。左の数字が履歴番号で、後述の履歴展開で使います。
423 systemctl restart nginx
451 systemctl status nginx
478 systemctl reload nginx
Ctrl+R でインクリメンタルサーチする
プロンプト上で Ctrl+R を押すと、逆順インクリメンタルサーチモードに入ります。文字を入力するたびに、直近の一致するコマンドがリアルタイムで表示されます。
(reverse-i-search)`ngi': systemctl restart nginx
目的のコマンドが表示されたら Enter でそのまま実行できます。もう一度 Ctrl+R を押すと、同じキーワードに一致するさらに古いコマンドへ移動できます。Ctrl+G または Esc でキャンセルできます。
見つかったコマンドを実行前に編集したい場合は、表示された状態で → キーまたは Ctrl+E を押すと通常の編集モードに切り替わります。
履歴展開で番号やパターンを使って呼び出す
bashには履歴展開(history expansion)という仕組みがあり、! を使ってコマンドを素早く呼び出せます。
直前のコマンドを再実行する
!!
!! は直前に実行したコマンドをそのまま繰り返します。sudo !! のように前置きを加えると、「さっきのコマンドをsudoで再実行する」という使い方もできます。
履歴番号を指定して実行する
!423
history コマンドで確認した番号を指定すると、その行をそのまま実行します。
コマンド名の先頭文字列で呼び出す
!systemctl
指定した文字列で始まる最後のコマンドを実行します。ただしコマンドの内容を確認せずに実行されるため、意図しないコマンドが走るリスクがあります。次のように :p を付けると実行せずに表示だけできます。
!systemctl:p
保存件数を増やして古い履歴も引き出せるようにする
デフォルトの保存件数はディストリビューションによって異なりますが、1000件程度に設定されていることが多いです。作業量が多い場合はこれでは足りません。~/.bashrc に次の設定を追加すると保存件数を増やせます。
HISTSIZE=10000
HISTFILESIZE=20000
HISTSIZE はシェルがメモリ上に保持する件数、HISTFILESIZE はファイルに書き出す件数です。設定を反映するには次のコマンドを実行するか、ターミナルを開き直します。
source ~/.bashrc
設定が反映されているかは次のコマンドで確認できます。
echo $HISTSIZE
echo $HISTFILESIZE
また、タイムスタンプを履歴に残しておくと「いつ実行したか」の手がかりになります。
HISTTIMEFORMAT="%Y-%m-%d %T "
設定後に history を実行すると、各行に日時が付いて表示されます。
よくあるつまずきと対処
ターミナルを閉じると履歴が消える・上書きされる
bashはデフォルトでシェル終了時に履歴をファイルへ上書きします。複数のターミナルを同時に使っていると、後から閉じたウィンドウの履歴が他のウィンドウの履歴を消してしまいます。
次の設定を ~/.bashrc に追加すると、上書きではなく追記モードになり、複数端末の履歴をまとめて残せます。
shopt -s histappend
HISTCONTROL の設定で履歴に残らないコマンドがある
HISTCONTROL という環境変数の値によっては、コマンドが履歴に記録されません。
ignorespace:先頭にスペースを入れたコマンドは記録しないignoredups:直前と同じコマンドは重複して記録しないignoreboth:上の2つ両方を適用する
現在の設定は次のコマンドで確認できます。
echo $HISTCONTROL
「スペースを入れると履歴に残らない」という挙動は意図的なもので、パスワードなど残したくないコマンドを実行するときに活用できます。
履歴展開が誤動作する・無効化されている
!! や !文字列 が展開されず、そのままコマンド名として解釈されてしまう場合、set +H によって履歴展開が無効化されている可能性があります。
次のコマンドで有効化できます。
set -H
zsh を使っている場合、履歴展開の書式が bash と一部異なります。zsh では !! は同様に使えますが、パターンまわりの挙動が違う場合があるため、zshのマニュアルも合わせて参照してください。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
