web-dev-qa-db-ja.com

bashの履歴はどこに保存されますか?

historyを実行すると、最後に実行したコマンドが表示されます。

しかし、もし私がtail -f $HISTFILEまたはtail -f ~/.bash_history、それらはリストされません。

ファイルはロックされますか?一時的な場所などはありますか?

106
Adionditsak

Bashは、実行中にコマンドのリストをメモリ内で内部的に維持します。それらは .bash_history on exit に書き込まれます:

対話型シェルが終了すると、最後の$ HISTSIZE行が履歴リストから$ HISTFILEで指定されたファイルにコピーされます

コマンド履歴を強制的に書き出す場合は、 history -a コマンドを使用できます。

新しい履歴行(現在のBashセッションの開始以降に入力された履歴行)を履歴ファイルに追加します。

-wオプションもあります:

現在の履歴を履歴ファイルに書き込みます。

履歴をどのように使用するかによりますが、どちらがより適しているかもしれません。

それらが常にすぐに書き込まれるようにしたい場合は、そのコマンドをPrompt_COMMAND変数に入れることができます。

export Prompt_COMMAND='history -a'
132
Michael Homer

(回答ではありませんが、コメントを追加することはできません)

特定のコマンド(たとえば、パスワードを平文で含む)を削除するだけで.bash_historyをチェックしている場合は、history -d <entry_id>を使用してメモリ内のエントリを直接削除できます。

たとえば、次のような出力があるとします。

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

export行を削除したい場合は、次のように簡単に実行できます。

history -d 928
14
Eddie C.

bashはそれを作業メモリに保持します。bashは、bashの終了時または各コマンドの実行後に保存し、bashの開始時または要求時にロードされるように構成できます。

コマンドごとに保存するように構成する場合は、複数のbashを同時に実行することの影響を考慮してください。 (コマンドラインはインターリーブされます)

11
ctrl-alt-delor

セッションがアクティブな間、コマンドはメモリ(RAM)に保存されます。シェルを閉じると、シャットダウンする前にコマンドリストが.bash_historyに書き込まれます。

したがって、現在のセッションの履歴は.bash_historyには表示されません。

5
JaySo

実行中、次の場合、履歴はメモリにのみ保持されます(デフォルト)。

  • set -o履歴(echo "$-"H)が設定されます。
  • HISTSIZEは0ではありませんおよび
  • HISTIGNOREは*(または他の非常に制限的なパターン)ではありません。

上記のいずれかが失敗した場合、メモリに履歴は保存されないため、履歴をディスクに書き込むことはできません。

メモリ内の履歴は、次の場合にディスクに書き込まれます。

  • HISTFILESIZEが0ではありませんおよび
  • HISTFILEは設定されていません。

ただし、シェルが終了したとき、またはコマンドhistory -a(追加)またはhistory -w(書き込み)が実行された場合のみです。

ディスクへの即時書き込みをトリガーするには、変数を使用できます。

 Prompt_COMMAND='history -a'

これは、履歴ファイルへのappendnew履歴行になります。これらは、現在のbashセッションの開始以降に入力された履歴行ですが、履歴ファイルにはまだ追加されていません。

または:

 Prompt_COMMAND='history -w'

To overwriteメモリからのリストを含むHISTFILEの履歴。

したがって、メモリ内の履歴からコマンドを削除できます。

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

そして、最後のコマンドでそれをディスクに書き込みます:

 history -w    # with `shopt -u histappend` unset
5
Isaac