history
| 対応: | 全Linux | |
|---|---|---|
| macOS(2001 Cheetah) | ||
| Bash 1.0(1989) |
『history』コマンドはシェルで実行したコマンドの履歴を管理します。過去に実行したコマンドを再利用したり、履歴を検索・編集・削除したりできます。履歴は ~/.bash_history ファイルに保存され、シェルの終了時に書き込まれます。
構文
履歴の一覧を表示します。番号付きで最新のコマンドまで一覧表示されます。
history
直近 N 件だけ表示します。
history N
履歴番号を指定してそのコマンドを実行します。
!番号
直前のコマンドを再実行します。
!!
指定した文字列で始まる最近のコマンドを再実行します。
!文字列
Ctrl+R を押すと逆方向インクリメンタル検索(reverse-i-search)が始まります。文字を入力すると一致するコマンドが表示され、Ctrl+R を繰り返すとさらに古い一致に移動できます。Enter で実行、Ctrl+G でキャンセルします。
Ctrl+R
オプション一覧
| オプション | 概要 |
|---|---|
| history | 履歴を番号付きで全件表示します。 |
| history N | 直近 N 件の履歴を表示します。 |
| history -c | メモリ上の履歴をすべて消去します。ファイルには残ります。 |
| history -d N | 履歴番号 N のエントリを削除します。 |
| history -w | 現在のメモリ上の履歴を ~/.bash_history に書き込みます。 |
| history -r | ~/.bash_history を読み込んでメモリ上の履歴に追加します。 |
| !番号 | 指定した番号の履歴コマンドを実行します。 |
| !! | 直前のコマンドを再実行します。 |
| !文字列 | 指定した文字列で始まる最近のコマンドを実行します。 |
| !?文字列 | 指定した文字列を含む最近のコマンドを実行します。 |
環境変数一覧
| 変数 | 概要 |
|---|---|
| HISTSIZE | メモリ上に保持する履歴の最大件数です。デフォルトは 500 または 1000(ディストリビューション依存)。 |
| HISTFILESIZE | ~/.bash_history に書き込む最大行数です。デフォルトは 500 または 2000(ディストリビューション依存)。 |
| HISTCONTROL | 履歴の記録制御フラグです。『ignoredups』(重複を記録しない)、『ignorespace』(先頭にスペースがあるコマンドを記録しない)、『erasedups』(重複エントリを全削除)、『ignoreboth』(ignoredups+ignorespace の両方)を指定できます。 |
| HISTIGNORE | 履歴に記録しないコマンドのパターンをコロン区切りで指定します。ワイルドカード * が使えます。例: HISTIGNORE="ls:pwd:exit" |
| HISTTIMEFORMAT | 指定すると各履歴エントリにタイムスタンプが付きます。『strftime』フォーマットで指定します。例: HISTTIMEFORMAT="%Y-%m-%d %T " |
| HISTFILE | 履歴を保存するファイルのパスです。デフォルトは『~/.bash_history』。 |
サンプルコード
直近 10 件の履歴を表示します。
history 10 491 grep "Kogami Shinya" crime_log.txt 492 cat dominator_access.log 493 wc -l case_archive.log 494 ssh kogami@10.0.0.1 495 cat sibyl_query.sh 496 chmod +x sibyl_query.sh 497 ./sibyl_query.sh 498 ls -la /var/log/psycho_pass/ 499 diff crime_log.txt case_archive.log 500 history 10
番号 492 のコマンドをそのまま再実行します。
!492 cat dominator_access.log 2040-04-01 09:12:33 Tsunemori Akane LETHAL_ELIMINATOR granted 2040-04-01 09:18:47 Kogami Shinya PARALYZER granted
直前のコマンドを再実行します。
!! cat dominator_access.log 2040-04-01 09:12:33 Tsunemori Akane LETHAL_ELIMINATOR granted 2040-04-01 09:18:47 Kogami Shinya PARALYZER granted
『diff』で始まる最近のコマンドを再実行します。
!diff diff crime_log.txt case_archive.log
履歴番号 493 のエントリを削除します。
history -d 493
メモリ上の履歴をすべて消去します。ファイルへの書き込み前なのでファイルには残ります。
history -c history
現在のメモリ上の履歴を即座にファイルへ書き込みます(通常はシェル終了時に書き込まれる)。
history -w
タイムスタンプ付きで履歴を表示する設定を『~/.bashrc』に追加します。
~/.bashrc
export HISTTIMEFORMAT="%Y-%m-%d %T " export HISTSIZE=10000 export HISTFILESIZE=20000 export HISTCONTROL=ignoreboth
source ~/.bashrc history 5 496 2040-04-01 09:05:11 chmod +x sibyl_query.sh 497 2040-04-01 09:06:03 ./sibyl_query.sh 498 2040-04-01 09:10:44 ls -la /var/log/psycho_pass/ 499 2040-04-01 09:14:55 diff crime_log.txt case_archive.log 500 2040-04-01 09:20:00 source ~/.bashrc
複数ターミナルで履歴を共有し、ターミナルを閉じるたびに追記保存するための設定です。
~/.bashrc
# 履歴を上書きではなく追記する shopt -s histappend # コマンド実行のたびに履歴をファイルへ書き込み、読み込み直す PROMPT_COMMAND="history -a; history -c; history -r"
概要
Bash の履歴はメモリ上の履歴(現在のセッション)とファイル上の履歴(『~/.bash_history』)の2段構成です。通常、ファイルへの書き込みはシェルの終了時(『exit』またはウィンドウを閉じたとき)に行われます。『history -w』で即時書き込み、『history -r』で再読み込みができます。
『!』を使った履歴実行(バン展開)は確認なしに実行される点に注意が必要です。『!!』や『!文字列』を実行する前に、『!!:p』(直前のコマンドを表示するだけで実行しない)や『!文字列:p』でコマンドを確認してから実行する習慣が安全です。
HISTCONTROL=ignorespace を設定すると、コマンドの先頭にスペースを入れることで履歴への記録を抑制できます。機密性の高い情報を扱う際に一時的に使える手段です。ただし後述のミスにあたるケースには留意が必要です。
よくあるミス
よくあるミス1: 複数ターミナルで履歴が上書きされる
Bash のデフォルト設定では、シェル終了時に現在のセッションの履歴が『~/.bash_history』を上書きします。複数のターミナルを同時に使っていると、最後に閉じたターミナルの履歴だけが残り、他のターミナルで実行したコマンドが消えてしまいます。
echo $HISTFILE /home/kogami/.bash_history
以下を『~/.bashrc』に追加すると、複数ターミナルの履歴が混在せず追記されます。
~/.bashrc
# 追記モード(デフォルトは上書き) shopt -s histappend # 各コマンド実行後にファイルへ書き込み → 全ターミナルから再読み込み PROMPT_COMMAND="history -a; history -c; history -r"
『history -a』は現在のセッションの新しいエントリをファイルへ追記します。『history -c』はメモリ上の履歴を消去します。『history -r』はファイルを読み込んでメモリに反映します。この3つを組み合わせることで、全ターミナルがリアルタイムに同じ履歴を参照できます。
よくあるミス2: パスワードをコマンドラインに入力して履歴に残る
コマンドの引数にパスワードを直接書くと、『~/.bash_history』にそのまま残ります。他のユーザーが同じマシンを使う環境や、ホームディレクトリを誤ってバックアップに含めた場合に漏洩するリスクがあります。
mysql -u ginoza -pS1byl_P4ss database_sibyl
上記のようなコマンドは履歴にそのまま記録されます。対策は複数あります。
対策1: コマンドの先頭にスペースを入れて『HISTCONTROL=ignorespace』を活用します。
~/.bashrc
export HISTCONTROL=ignoreboth
mysql -u ginoza -pS1byl_P4ss database_sibyl
先頭のスペース(行の最初の空白)によってこのコマンドは履歴に記録されません。ただし『HISTCONTROL』の設定を忘れると無効です。
対策2: パスワードをコマンドライン引数に書かず、設定ファイルや環境変数・インタラクティブプロンプト経由で渡します。
mysql -u masaoka -p database_sibyl Enter password:
-p だけ指定するとパスワードを対話入力するプロンプトが表示され、入力内容は履歴に残りません。可能であればこの方法が安全です。
対策3: 履歴に残ってしまった場合は『history -d』で該当エントリを削除し、『history -w』でファイルに書き込みます。
history | grep mysql 342 mysql -u ginoza -pS1byl_P4ss database_sibyl history -d 342 history -w
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。