創造的で関係のある信号ですか?OK:
trap on_exit EXIT
trap on_usr1 USR1
on_exit() {
history -a
trap '' USR1
killall -u "$USER" -USR1 bash
}
on_usr1() {
history -n
}
それを挟んで.bashrc
行く。これはbash
、別のプロセスが終了したときに、すべてのプロセスに新しい履歴エントリをチェックするよう指示するために信号を使用します。これはかなりひどいですが、本当に機能します。
どのように機能しますか?
trap
システム信号またはBashの内部イベントのいずれかに信号ハンドラーを設定します。このEXIT
イベントは、シェルの制御された終了です。一方、USR1
はSIGUSR1
、意味のないシグナルです。
シェルが終了するたびに、次のことを行います。
- すべての履歴を明示的にファイルに追加します。
SIGUSR1
ハンドラーを無効にして、このシェルがシグナルを無視するようにします。
bash
同じユーザーから実行中のすべてのプロセスにシグナルを送信します。
ときにSIGUSR1
到着し、我々 :
- 履歴ファイルからシェルのメモリ内履歴リストにすべての新しいエントリをロードします。
あなたがヒットするまでためバッシュハンドル信号道、あなたが実際に新しい履歴データを取得することはありませんEnter次回、これは任意のより良いその前面に置くよりも行いませんので、history -n
へPROMPT_COMMAND
。ただし、何も起きていない場合は常にファイルの読み取りを保存し、シェルが終了するまで書き込みは一切行われません。
ただし、まだいくつかの問題があります。1つ目は、デフォルトの応答SIGUSR1
はシェルを終了することです。他のbash
プロセス(たとえば、シェルスクリプトの実行)は強制終了されます。.bashrc
非対話型シェルによってロードされません。代わりに、という名前のファイルBASH_ENV
がロードされます。環境内の変数をグローバルに設定して、ファイルを指すようにできます。
trap '' USR1
その中の信号を無視します(問題を解決します)。
最後に、これはあなたが要求したことを行いますが、あなたが得る順序は少し珍しいでしょう。特に、個別にロードされて保存されると、履歴のビットが異なる順序で繰り返されます。それはあなたが求めているものに本質的に内在していますが、上向き矢印の歴史はこの時点ではあまり有用ではないことに注意してください。ただし、履歴の置換などは共有され、適切に機能します。