history
を実行すると、最後に実行したコマンドが表示されます。
しかし、もし私がtail -f $HISTFILE
またはtail -f ~/.bash_history
、それらはリストされません。
ファイルはロックされますか?一時的な場所などはありますか?
Bashは、実行中にコマンドのリストをメモリ内で内部的に維持します。それらは .bash_history
on exit に書き込まれます:
対話型シェルが終了すると、最後の$ HISTSIZE行が履歴リストから$ HISTFILEで指定されたファイルにコピーされます
コマンド履歴を強制的に書き出す場合は、 history -a
コマンドを使用できます。
新しい履歴行(現在のBashセッションの開始以降に入力された履歴行)を履歴ファイルに追加します。
-w
オプションもあります:
現在の履歴を履歴ファイルに書き込みます。
履歴をどのように使用するかによりますが、どちらがより適しているかもしれません。
それらが常にすぐに書き込まれるようにしたい場合は、そのコマンドをPrompt_COMMAND
変数に入れることができます。
export Prompt_COMMAND='history -a'
(回答ではありませんが、コメントを追加することはできません)
特定のコマンド(たとえば、パスワードを平文で含む)を削除するだけで.bash_history
をチェックしている場合は、history -d <entry_id>
を使用してメモリ内のエントリを直接削除できます。
たとえば、次のような出力があるとします。
$ history
926 ll
927 cd ..
928 export --password=super_secret
929 ll
export
行を削除したい場合は、次のように簡単に実行できます。
history -d 928
bashはそれを作業メモリに保持します。bashは、bashの終了時または各コマンドの実行後に保存し、bashの開始時または要求時にロードされるように構成できます。
コマンドごとに保存するように構成する場合は、複数のbashを同時に実行することの影響を考慮してください。 (コマンドラインはインターリーブされます)
セッションがアクティブな間、コマンドはメモリ(RAM)に保存されます。シェルを閉じると、シャットダウンする前にコマンドリストが.bash_history
に書き込まれます。
したがって、現在のセッションの履歴は.bash_history
には表示されません。
実行中、次の場合、履歴はメモリにのみ保持されます(デフォルト)。
echo "$-"
のH
)が設定されます。0
ではありませんおよび*
(または他の非常に制限的なパターン)ではありません。上記のいずれかが失敗した場合、メモリに履歴は保存されないため、履歴をディスクに書き込むことはできません。
メモリ内の履歴は、次の場合にディスクに書き込まれます。
ただし、シェルが終了したとき、またはコマンドhistory -a
(追加)またはhistory -w
(書き込み)が実行された場合のみです。
ディスクへの即時書き込みをトリガーするには、変数を使用できます。
Prompt_COMMAND='history -a'
これは、履歴ファイルへのappend
new
履歴行になります。これらは、現在の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