フォローする回答:
同時に、複数のbashインスタンスを閉じると履歴が消去される可能性がある既知の競合状態があります。これは、bash履歴ファイルを作成するときにロックが使用されないために発生します。
bash履歴の削除を防ぐ方法は?
urxvt
私はi3wmを使用していますが、端末を手動で閉じる前にコンピュータをシャットダウンしたときにこれが主に起こると思います。 (キーバインディングによる)終了コマンドはですsystemctl poweroff
。
答え1
競合状態の原因は、bashがシェルが終了したときにのみ履歴ファイルに書き込むことです。また、複数のシェルが実行されている場合は、既存の履歴ファイルを上書きし、最後に終了したシェルのみが履歴を支配します。
したがって、1つの解決策は、各コマンドの後にレコードを書き込むことです。これにより、矢印を上にして別のウィンドウで発生した履歴イベントを表示できるため、実行したコマンドが開いているすべてのシェルに露出するなど、悪影響を及ぼす可能性があります。これが起こる可能性が最も高いのは、「上矢印をN回押してEnterキーを押す」などの繰り返しコマンドセットを実行し続ける場合です。バックグラウンドプロセスが閉じたウィンドウで終わると、突然どのコマンドが実際に「N + 1の上向き矢印」であるかを注意深く見てください。これは間違ったコマンドを実行する危険性があります。
「コマンドごとの履歴」をオンにするには、これを.bashrcに追加します(保存する履歴行の数は単なる例であり、必要に応じて変更できます)。
HISTFILESIZE=400000000
HISTSIZE=10000
PROMPT_COMMAND="history -a"
export HISTSIZE PROMPT_COMMAND
shopt -s histappend
答え2
Bashを起動すると、履歴が削除されたことを警告します(行数で測定)。履歴が削除されていない場合、バックアップが作成されます。
~/.bashrc
# backup history/warn about deleted history
if (( $(wc -l < ~/.bash_history) < 1100 ))
then
echo "#########################"
echo ".bash_history was cleared"
echo "#########################"
else
cp ~/.bash_history ~/.bash_history.back
fi
答え3
私の解決策は、ログアウトする前にメモリ内の記録をディスク内の記録とマージすることでした。
履歴タイムスタンプの順序とそのタイムスタンプ内のコマンドの順序を維持しながら、これを行います。
定義されたPerl REに従って、一意のコマンド(複数行を含む)を削除するか、単純で敏感なコマンドを削除(消去)するオプションがあります。合わせて調整してください!
これが結果です...https://antofthy.gitlab.io/software/history_merge.bash.txt
シェルエイリアス「hc」(記録クリーンアップ)を介して「要求時に」スクリプトをインポートして終了する前に、「.bash_logout」設定ファイルからマージ/クリーンアップします。
楽しんでください。