言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Linux & Mac & Bashコマンド辞典

  1. トップページ
  2. Linux & Mac & Bashコマンド辞典
  3. history

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

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。