web-dev-qa-db-ja.com

.bash_historyへの書き込みをすぐに行うことは可能ですか?

多くの場合、多くのターミナルを開きます[現在、このワークスペースで7つ開いています]。最近historygrepを検索して、最近書いたコマンドを見つけることがよくありますが、ターミナルを探してから、スクロールしてさらに探したいなど。ターミナルが「終了」せずに閉じてしまい、書いたものがすべて失われることがあります[ターミナルで書いたものが必要な場合があります殺された]。

各端末がすぐに.bash_historyに書き込むようにする方法はありますか?または少なくとも1分に1回、またはそのような何か?

122
Matt

リアルタイムでのBash履歴の更新 で説明されているシンプルなソリューション。

これらのコマンドを.bashrc構成に入れるように指示されています。

shopt -s histappend
Prompt_COMMAND="history -a;$Prompt_COMMAND"

最初のコマンドは、.historyファイルモードを追加に変更します。 2番目のコマンドは、history -aコマンドが各シェルプロンプトで実行されるように構成します。 -aは、現在の行と新しい行をすぐに履歴ファイルに書き込みます。

Zshに関連:

89
mario

これを.bashrcに入れてみてください:

shopt -s histappend                      # append to history, don't overwrite it
export Prompt_COMMAND="history -a; history -c; history -r; $Prompt_COMMAND"

ここにクレジット: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -cは、実行中のセッションの履歴をクリアします。これにより、$HISTSIZEの量だけ履歴カウンターが減少します。 history -r$HISTFILEの内容を読み取り、現在実行中のセッション履歴に挿入します。これにより、$HISTFILEの行数だけ履歴カウンターが増加します。

私はそれがコマンドがほとんどすぐに利用できることを意味すると思います(あなたは1つの端末を持ち、echo 1、2番目の端末echo 2、最初のecho 3を書き、矢印を2回押すとecho 2 available。記述された内容にアクセスするには、特定の端末でコマンドを発行する必要があります。

54
sup

約100000エントリの大きな履歴ファイルがあり、履歴リストをクリアし、履歴ファイル全体を(history -cおよびhistory -rを使用して)読み込むバリアントは、プロンプトが表示されます。履歴ファイルから新しい行のみが読み取られるようにhistory -nを使用すると、より高速になります。

shopt -s histappend
Prompt_COMMAND='history -a;history -n'

Prompt_COMMANDはシェル変数であるため、エクスポートする必要はありません。

37
nisetama

他のすべての回答に関するメモ(基本的に同じものです):

Prompt_COMMAND="history -a;$Prompt_COMMAND"(または友人)に.bashrcを設定するだけで十分です。

また、現在のセッションの履歴を「スナップショット」したいときはいつでもhistory -aを手動で実行できます。

shopt -s histappendコマンドは、history -aが常にファイルに新しい行を追加し、上書きしないため、必要ありません。また、少なくともBash 4では、histappendがデフォルトの動作です。

3
Guss