Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Linuxのhistoryコマンドを完全マスター:覚えておきたい15の強力なテクニックと実例

Linuxのhistoryコマンドを完全マスター:覚えておきたい15の強力なテクニックと実例Linuxのコマンドラインを日常的に使っているなら、history(履歴)機能を効果的に活用することが生産性向上の大きな鍵となります。本記事で紹介する15の実例をマスターすれば、コマンドライン操作がこれまで以上に快適で楽しいものになるはずです。

1. HISTTIMEFORMATでタイムスタンプを表示する

通常、コマンドラインで「history」と入力すると、コマンド番号とコマンド内容が表示されるだけです。監査目的などでは、以下のようにタイムスタンプを併せて表示できると非常に便利です。

# export HISTTIMEFORMAT='%F %T '
# history | more
1 2008-08-05 19:02:39 service network restart
2 2008-08-05 19:02:39 exit
3 2008-08-05 19:02:39 id
4 2008-08-05 19:02:39 cat /etc/redhat-release

2. Ctrl+Rで履歴を検索する

これはおそらく最も使用頻度の高いhistory機能でしょう。一度実行した長いコマンドを再利用したいとき、キーワードで検索すれば全文を打ち直す必要はありません。Ctrl+Rを押してキーワードを入力してください。以下の例では「red」で検索し、履歴内の「cat /etc/redhat-release」というコマンドが表示されています。

# [コマンドプロンプトでCtrl+Rを押すと、
逆順検索(reverse-i-search)プロンプトが表示されます]
(reverse-i-search)`red': cat /etc/redhat-release
[注意:目的のコマンドが表示されたらEnterを押すと、
そのコマンドがそのまま実行されます]
# cat /etc/redhat-release
Fedora release 9 (Sulphur)

実行前にコマンドを編集したい場合もあります。たとえば「httpd」で検索すると、履歴から「service httpd stop」が表示されます。この状態で左矢印または右矢印キーを押すとコマンドが編集可能になり、「stop」を「start」に変更してから再実行できます。

# [コマンドプロンプトでCtrl+Rを押すと、
逆順検索プロンプトが表示されます]
(reverse-i-search)`httpd': service httpd stop
[注意:目的のコマンドが表示されたら左右どちらかの矢印キーを押すと、
実行前にコマンドを編集できます]
# service httpd start

3. 直前のコマンドを素早く繰り返す4つの方法

さまざまな理由で直前のコマンドを繰り返し実行したい場面は多いものです。最後に実行したコマンドを再実行するには、次の4つの方法があります。

  1. 上矢印キーで前のコマンドを表示し、Enterで実行する。
  2. コマンドラインで「!!」と入力してEnterを押す。
  3. コマンドラインで「!-1」と入力してEnterを押す。
  4. Ctrl+Pで前のコマンドを表示し、Enterで実行する。

4. 履歴から特定のコマンドを実行する

以下の例のように、履歴の4番目のコマンドを再実行したい場合は「!4」と入力します。

# history | more
1 service network restart
2 exit
3 id
4 cat /etc/redhat-release
# !4
cat /etc/redhat-release
Fedora release 9 (Sulphur)

5. 特定の単語で始まる直前のコマンドを実行する

「!」に続けて、再実行したいコマンドの先頭の数文字を入力します。以下の例では「!ps」と入力してEnterを押すことで、「ps aux | grep yp」というpsで始まる直近のコマンドが実行されました。

# !ps
ps aux | grep yp
root 16947 0.0 0.1 36516 1264 ? Sl 13:10 0:00 ypbind
root 17503 0.0 0.0 4124 740 pts/0 S+ 19:19 0:00 grep yp

6. HISTSIZEで履歴の保存行数を制御する

.bash_profileに以下の2行を追加し、bashシェルに再ログインすると設定が反映されます。この例では、bashの履歴に保存されるのは450件のみです。

# vi ~/.bash_profile
HISTSIZE=450
HISTFILESIZE=450

7. HISTFILEで履歴ファイル名を変更する

デフォルトでは、履歴は~/.bash_historyファイルに保存されます。.bash_profileに以下の1行を追加してbashシェルに再ログインすると、履歴が.bash_historyではなく.commandline_warriorファイルに保存されるようになります。実用的な使い道はまだ見出せていませんが、ターミナルごとに異なる履歴ファイル名を使って、それぞれの端末から実行されたコマンドを追跡したい場合などに役立つかもしれません。

# vi ~/.bash_profile
HISTFILE=/root/.commandline_warrior

履歴ファイル名を変更する明確な理由をお持ちの方は、ぜひその活用方法を教えてください。

8. HISTCONTROLで連続する重複エントリを排除する

以下の例ではpwdが3回入力されており、historyを実行すると3回連続で記録されているのがわかります。このような重複を排除するには、HISTCONTROLに「ignoredups」を設定します。

# pwd
# pwd
# pwd
# history | tail -4
44 pwd
45 pwd
46 pwd [上記のようにpwdを3回実行すると、履歴には3つのpwdが記録される]
47 history | tail -4
# export HISTCONTROL=ignoredups
# pwd
# pwd
# pwd
# history | tail -3
56 export HISTCONTROL=ignoredups
57 pwd [上記のようにpwdを3回実行しても、履歴には1つのpwdしか記録されない]
58 history | tail -4

9. HISTCONTROLで履歴全体から重複を排除する

前述の「ignoredups」は、連続して実行された場合の重複しか除去できません。履歴全体から重複を排除したい場合は、HISTCONTROLに「erasedups」を設定します。

# export HISTCONTROL=erasedups
# pwd
# service httpd stop
# history | tail -3
38 pwd
39 service httpd stop
40 history | tail -3
# ls -ltr
# service httpd stop
# history | tail -6
35 export HISTCONTROL=erasedups
36 pwd
37 history | tail -3
38 ls -ltr
39 service httpd stop
[注意:pwdの後に実行されていた以前のservice httpd stopが消去されている]
40 history | tail -6

10. HISTCONTROLで特定のコマンドを履歴に記録させない

HISTCONTROLに「ignorespace」を設定したうえで、コマンドの先頭にスペースを1つ入力すると、そのコマンドは履歴に記録されなくなります。若手システム管理者の間では「履歴からコマンドを隠せる」と人気の機能ですが、ignorespaceの仕組みを理解しておくのは良いことです。ただし、ベストプラクティスとしては、意図的に履歴から何かを隠すことは避けるべきです。

# export HISTCONTROL=ignorespace
# ls -ltr
# pwd
#  service httpd stop [注意:serviceの先頭にスペースがあるため、
このコマンドは履歴に記録されない]
# history | tail -3
67 ls -ltr
68 pwd
69 history | tail -3

11. -cオプションで過去の履歴をすべて消去する

過去の履歴をすべて消去しつつ、それ以降の履歴記録は継続したい場合があります。そんなときは以下のコマンドを使用します。

# history -c

12. 履歴コマンドから引数を流用する

履歴を検索しているとき、別のコマンドを実行しつつ、直前に検索したコマンドの引数だけを流用したいことがあります。

以下の例では、viコマンドに続く「!!:$」によって、直前のコマンドの引数が現在のコマンドに引き継がれています。

# ls anaconda-ks.cfg
anaconda-ks.cfg
# vi !!:$
vi anaconda-ks.cfg

次の例では、viコマンドに続く「!^」により、直前のコマンド(cpコマンド)の最初の引数が現在のコマンド(viコマンド)に引き継がれています。

# cp anaconda-ks.cfg anaconda-ks.cfg.bak
anaconda-ks.cfg
# vi !^
vi anaconda-ks.cfg

13. 特定のコマンドの特定の引数を置換して使う

以下の例では、「!cp:2」により、履歴内でcpで始まる直前のコマンドを探し、その2番目の引数をls -lコマンドに代入しています。

# cp ~/longname.txt /really/a/very/long/path/long-filename.txt
# ls -l !cp:2
ls -l /really/a/very/long/path/long-filename.txt

同様に「!cp:$」を使うと、cpで始まる直前のコマンドの最後の引数(この例では上記と同じく2番目の引数)を取り出し、ls -lコマンドに代入できます。

# ls -l !cp:$
ls -l /really/a/very/long/path/long-filename.txt

14. HISTSIZEでhistory機能自体を無効化する

履歴機能を完全に無効化し、bashシェルに入力したコマンドを一切記憶させたくない場合は、HISTSIZEを0に設定します。

# export HISTSIZE=0
# history
# [注意:historyを実行しても何も表示されない]

15. HISTIGNOREで特定のコマンドを履歴から除外する

pwdやlsといった基本的なコマンドで履歴を汚したくないこともあるでしょう。HISTIGNOREを使えば、履歴に記録したくないコマンドをまとめて指定できます。ただし注意点として、HISTIGNOREに「ls」を追加しても除外されるのは「ls」だけで、「ls -l」は除外されません。除外したいコマンドは正確に指定する必要があります。

# export HISTIGNORE="pwd:ls:ls -ltr:"
# pwd
# ls
# ls -ltr
# service httpd stop
# history | tail -3
79 export HISTIGNORE="pwd:ls:ls -ltr:"
80 service httpd stop
81 history
[注意:pwd、ls、ls -ltrは履歴に記録されていない]

おすすめの書籍

Linuxのhistoryコマンドを完全マスター:覚えておきたい15の強力なテクニックと実例Ramesh Natarajan著『Bash 101 Hacks』。筆者はほとんどの時間をLinux環境で過ごしており、当然ながらBashコマンドラインとシェルスクリプトの大ファンです。15年前に各種*nix系OSで開発していた頃は、CシェルやKornシェルで多くのコードを書いていました。その後、システム管理者としてLinuxに携わるようになってからは、あらゆるタスクをBashシェルスクリプトで自動化するようになりました。そうした経験をもとに、Bashコマンドラインとシェルスクリプトに関する101の実践的な例を収録した電子書籍『Bash 101 Hacks』を執筆しました。Bashを本気でマスターしたいと考えているなら、ぜひ一読してみてください。Bashのコマンドラインとシェルスクリプトを自在に操れるようになるはずです。

関連するLinux記事

以下の「15の実例」シリーズ記事も参考になるかもしれません。

  • Unix lsコマンド:実践的な15の使用例
  • grepを極める!実践的なgrepコマンド15選
  • Linux crontab:便利なcronジョブ15選
  • findコマンドの実践的な使い方15選

  1. 2025年版:Linuxタイル型ウィンドウマネージャーおすすめ15選【完全ガイド】

    名前の通り、Linuxウィンドウマネージャーはアプリケーションウィンドウの動作を制御する役割を担っています。OSのバックグラウンドで静かに稼働し、開いているプログラムの見た目や配置を管理しています。 Linuxで使えるウィンドウマネージャーは数多く存在しますが、本記事では、その中でも特に優れたタイル型ウィンドウマネージャー15選を厳選してご紹介します。 1. i3 – 改良版タイル型WM i3は、フリーでオープンソースの完全にカスタマイズ可能なウィンドウマネージャーで、上級者向けのLinuxやBSDユーザー・開発者をターゲットとしています。ツリー構造のデータ構造を採用しており、他の代替製品より

  2. Bashのsleepコマンド徹底解説 – シェルスクリプトをN秒間待機させる方法(実行例付き)

    シェルスクリプトを書いていると、処理を進める前に一定時間待機させたい場面に出くわすことがあります。たとえば、あるプロセスの完了を待ちたい場合や、失敗したコマンドを再試行する前に間隔を空けたい場合などがその代表例です。そんなときに役立つのが、シンプルで扱いやすい sleep コマンドです。Bashのsleepコマンドの基本的な使い方sleep コマンドは非常に汎用性が高く、構文もとてもシンプルです。使い方は sleep N と入力するだけ。これだけでスクリプトは N 秒間一時停止します。N には正の整数または小数(浮動小数点数)を指定できます。まずは基本的な例を見てみましょう。echo Hell