History -a コマンドを定期的に自動実行するには?

History -a コマンドを定期的に自動実行するには?

history -a私はbashシェルを使用しており、時には手動でコマンドを実行します。私の一般的なシェルセッションは数週間または数ヶ月間続き、シェルセッションをほとんど終了しません。そのため、history -a時々現在のセッション履歴を強制的にbash_historyに記録するようにします。history -a毎日定期的に実行される自動化スクリプトを作成するつもりです。これを達成するための最良の方法は何ですか?

答え1

1 日に 1 回以上キーを押すと、ENTERPROMPT_COMMAND ベースのソリューションが役に立ちます。

save_history_daily () {
  # if the current time is more than a day's-worth of seconds newer than
  # the modification time of $HISTFILE, then run 'history -a'

  if (( $(printf '%(%s)T' -1) - 86400 > $(stat -c %Y "$HISTFILE") ))
  then 
    history -a
  fi
}

PROMPT_COMMAND="$PROMPT_COMMAND
save_history_daily"

これはbashバージョンbash-4.2-alpha以降の機能に依存しますprintf %(...)T。ここでは-1、その引数を使用して現在時刻(エポック以降の秒)を取得します。以前のbashバージョンがある場合は、次のように呼び出してdateこのビットを置き換えることができます$(date +%s)。 bash-5.0-alpha で始まる Bash バージョンでは EPOCHSECONDS 変数を使用できますが、これはやや効率的です。

PROMPT_COMMAND 割り当てに改行文字を挿入するアイデアをコピーしました。Gilesの答えの1つ;定義された既存の値に新しい関数呼び出しを追加します。

答え2

まず、history実行されるセッションに影響を与えるBash組み込みコマンドです。私が知っている限り、まだ保存されていない最近のコマンドを保存するために別のセッションで履歴コマンドを実行することはできません。

PROMPT_COMMAND1つの解決策は、すべてのコマンド項目で実行されるように環境変数を変更することです。history -aこの投稿役に立つかもしれません。

答え3

スクリプトからシェル履歴を保存できません。とにかく直接的ではありません。

これは一般的にテストされていないアイデアです。

シェルは、対話型シェルとして機能するか非対話型シェルとして機能するか、bashこの信号を無視します。QUIT

これは、信号を捕捉するためにトラップを設置できることを意味しますQUIT。これは、対話型シェルセッションのシェル起動ファイルを介して実行できます(たとえば、~/.bashrcトラップは単に次のように呼び出しますhistory -a。 )

trap 'history -a' QUIT

その後、このシグナルをQUITシェルセッションに送信して履歴を保存することができます。を使用すると、次のように送信することもpkillできます。みんな bash現在実行中のセッション:

pkill -QUIT -U "$LOGNAME" bash

これはcron操作で行うことができます。

実際に見る以外はある程度テストしませんでした。現れる働いている。唯一の問題は、^\シェルのプロンプトがこのようにシグナルを送信することです。私はただします。仮説多くの貝が歴史を保存するなら同時に、混合書き込みを防ぐために賢明な方法で行われます。


個人的には、おそらくhistory -a次のものをPROMPT_COMMAND代わりに使用することを選択します。

PROMPT_COMMAND+="${PROMPT_COMMAND:+;}history -a"

または

PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND;}history -a"

(変数に既にnull以外の値がある場合は、history -a値に追加され、でPROMPT_COMMAND区切ります。);

これにより、次のプロンプトが表示される前に履歴が保存されます。プロンプトが表示されるたびに、この操作を実行しても顕著なパフォーマンス低下が発生しない可能性があります。

関連情報