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


125

多くの場合、多くのターミナルを開きます(現在、このワークスペースで7つ開いています)。最近書いたコマンドを見つけるために頻繁に検索historygrepますが、ターミナルを探して上にスクロールしたくありません。端末を「終了」せずに閉じたり、書いたものがすべて失われたりすることがあります[時々、端末で殺されたものが必要だったことがあります]。

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


2
通常control-r、1つのbashのコマンド履歴で逆検索するために使用します。history | grep正規表現が必要でない場合よりも便利です。
ピーター

回答:


93

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

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

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

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

zshに関連:


1
まあこの種の作品。さらにテストを試みましたが、最初のコマンドでのみ機能するようです。それはあなたのために正しく動作しますか?
マット

55

これをあなたのに入れてみてください.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利用可能になるはずです。書かれています。


ブリリアント!ありがとう。これらのオプションはで文書化されていない理由を不思議に思うman history...
artfulrobot

10
@artfulrobot:このコマンドはbash組み込みであるため、で説明されていman bashます。を使用することもできますhelp history
pabouk

2
zshは次のように動作するように構成されています。各シェルは自身の履歴(およびその前に結合された履歴)を追跡し、すべてのコマンドが結合された履歴に追加されます。これは、シェルの端末ごとに異なる「作業のスレッド」または「ジョブ」を持つ傾向があるため、すべてのシェルのすべてのコマンドの履歴を常に再ロードするのとは異なりより優れています。これは、-rとの-c対の違いと思います-a
スティーブンルー

それで、あなたは正確に何を使用していますか?history -c; history -r?私はそれがあなたにとってより良いと思います、それは時々私にとってより良いでしょう、私はしばしば複数のシェルを使用して1つの仕事をするので、できるだけ多くの履歴を持っていることを好みます。私は実際、コマンドが終了した後にのみ履歴に書き込まれることを気にしています。通常、あるホストに対してsshセッションを開始し、最初のホストがまだ実行中に別のホストを開きたい場合は、まだ履歴に書き込まれていないため、再入力する必要があります。
sup

私は十分な長さを同時にbashのを作る(シェルインスタンスごと)歴史の並列スレッドを追跡する方法を見つけ出すために周り立ち往生ことはありませんだと思いながら、すぐにメインの履歴ファイルへの歴史を書いて。Zshを使用すると、これが非常に簡単になります。さらに、zsh関数を定義して、考案した拡張履歴ファイルに多くの派手なメタデータを書き出します。むしろ不可欠になっています。とにかく、zshのprecmd()およびpreexec()のメカニズムは、入力されたコマンドを説明する引数を送信します。その後、それをファイルに送信するのは簡単です。history -a十分かもしれません
スティーブンルー

38

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

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

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


ブリリアント!接続が切断されても履歴は失われません!
トビア

これは素晴らしい。ファイルに追加してファイルから読み取ることにより、複数の端末間で履歴を共有します。
ウィスバッキー

3

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

(または友人)PROMPT_COMMAND="history -a;$PROMPT_COMMAND"での設定で.bashrc十分です。

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

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


私のMac 10.13.6では、それなしでは機能しなかったようshopt -s histappendです。また、私はそれを自分の~/.bash_profile
ubershmekel

システムのどこかに無効histappendになっている別の設定がある可能性があります。これはデフォルトの動作です。探していますが、Macにアクセスできません。
グス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.