ある端末を終了したときに別の端末のbash履歴を更新する

ある端末を終了したときに別の端末のbash履歴を更新する

私はこの質問がここで質問されたのであいまいではないことを知っています。継続的に更新(そして繰り返すここ)。

私が達成したいのは少し異なります。ls()を入力するたびにhistory -a; history -c; history -rファイルを再作成するように求められます。

終了時にファイルを更新したいです。これは単純ですが(実際にはデフォルト値)、オーバーライドする代わりに追加する必要があります。

shopt -s histappend

1つの端末が閉じたら、開いている他のすべての端末が更新について知っていることを願っています。

$PS1私は私が入力したすべての内容を確認せずにcommandこれを行うことを好みます。ある種の信号を捉える方が良いと思います。あなたは何をしますか?できない場合は簡単なのでしょうかcronjob

この問題をどのように解決できますか?

ベストアンサー1

創造的で参加的な信号を教えてください。いいね:

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の内部イベントの1つの場合。イベントEXITはシェルの制御された終了であり、私たちが占める意味のない信号USR1です。SIGUSR1

シェルが終了するたびに、次のことを行います。

  • すべての履歴をファイルに明示的に追加します。
  • SIGUSR1ハンドラを無効にしてこのシェルを作成します。無視する信号。
  • bash同じユーザーの実行中のすべてのプロセスにシグナルを送信します。

Aが到着したら、SIGUSR1我々は:

  • 履歴ファイルのすべての新しいエントリをシェルのメモリ内履歴リストにロードします。

Bashが信号を処理する方法のため、Enter実際に次のクリックまで新しい履歴データを取得できないため、これは入力よりも優れていません。history -n入力するPROMPT_COMMAND。ただし、何も起こらない場合は、ファイルを読み続け、シェルが終了するまでまったく書き込みません。


しかし、ここにはまだいくつかの問題があります。最初はデフォルトの応答SIGUSR1は終了です。シェル。他のすべてのbashプロセス(シェルスクリプトの実行など)は終了します。.bashrc非対話型シェルにはロードされません。代わりに、名前付きBASH_ENVファイル:グローバル環境では、この変数がファイルを指すように設定できます。

trap '' USR1

信号を無視します(これは問題を解決します)。

結局、これはあなたが要求したように行われますが、あなたが受け取る順序は少し変わります。特に、履歴が別々にロードされ保存された場合は、別の順序で繰り返されます。これは本質的にあなたが要求するものですが、この時点で上向きの矢印の記録ははるかに少ない便利です。歴史的代替しかし、同様のコンテンツは共有され、うまく機能します。

おすすめ記事