私はこの質問がここで質問されたのであいまいではないことを知っています。継続的に更新(そして繰り返すここ)。
私が達成したいのは少し異なります。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
信号を無視します(これは問題を解決します)。
結局、これはあなたが要求したように行われますが、あなたが受け取る順序は少し変わります。特に、履歴が別々にロードされ保存された場合は、別の順序で繰り返されます。これは本質的にあなたが要求するものですが、この時点で上向きの矢印の記録ははるかに少ない便利です。歴史的代替しかし、同様のコンテンツは共有され、うまく機能します。