histappend使用時のbash履歴の損失


18

私は多くの歴史を保持するのが好きなので、自分のをhistappend設定しました.bashrc。ほとんどの場合、すべてが正常に機能し、多くのシェルが追加されて履歴が構築されます。しかし、時々、新しいシェルを起動し、履歴全体を失っていることがわかります-そして、最後のシェルから終了するコマンドの一部のみが含まれていることがよくあります(つまり、追加する代わりに上書きするだけではありません) )。このため、.bash_historyファイルを強制終了する他のプロセスからではなく、シェルの終了時に発生しているのではないかと疑っています。この結論を裏付けるように、プロンプトに履歴コマンド番号がありますが、ジャンプするのを見たことはありません。

誰もが同様の問題に遭遇しましたか?または、問題を追跡する方法についての提案がありますか?


回答:


13

私自身の質問に答えてすみませんが、他の答えはどれも実際に問題に対処していません。

最終的に、これはgnome-terminalそれ自体を閉じたときにのみ発生することがわかりました(つまり、ファイル>終了、「x」ボタン、alt + F4)。ctrl-Dを使用してシェルを閉じ、端末を追跡する場合、このようなことは起こりません。

十分にピン留めできれば、gnome-terminalバグレポートを提出します。それまでの間、おそらくこれはグーグルからここに来る他の人々を助けるでしょう!


10

これが発生する理由はわかりませんが、プロンプトを表示するたびにbashに履歴ファイルへの書き込みを強制することにより、問題を回避できます。

PROMPT_COMMAND="history -a; history -n"

これにより、bashが次のコマンドの入力を求めるたびに、履歴ファイルが書き込まれ(-a)、再度読み込まれます(-n)。追加の利点:シェル2の履歴のシェル1でコマンドXを取得します。


GNU bash、バージョン3.00.15(1)-release(i686-redhat-linux-gnu)では機能しません
David Mackintosh

2
「機能しない」とはどういう意味ですか?
innaM 09

3
あなたが引用する追加の利点は、多くの場合、欠点です。私が探している動作ではありません。2つの完全に別々のタスクを別々のシェルで実行している可能性があり、それらの履歴を混在させたくないためです。これもおそらく何の助けにもなりません。履歴が消えると、.bash_historyの内容が削除されます-シェルの出口で書き込まれたのか、PROMPT_COMMANDで書き込まれたのかは関係ないと思います。
カスカベル

5
history -nフレークです。行う方がより信頼できますhistory -a; history -c; history -r。これを説明するために、最初history -aに正しいことを行うことに注意.bash_historyしてくださいhistory -a。すべてのコマンドの後に実行すると仮定すると、入力したすべてのコマンドが入力した順序で含まれます。課題は、シェルの履歴の考え方を.bash_historyファイルと同期させることです。これは-cand -rで簡単です。問題は、サイズが大きいと遅くなる可能性があることです。-nどの行が新しいかを誤って識別するため、破損する可能性があります。(ここでスペースが不足しています!)
アーロンマクデイド

4
(...を使用する場合-n)シェル1:でコマンドを実行することを想像してくださいls。次に、別のシェルShell Twoでを実行しcdます。これで、.bash_historyの履歴が正しいのはhistory -a、あなたのPROMPT_COMMAND-に含まれるからls \n cd \nです。次に、シェル1に戻り、と入力しpwdます。Shell One 、履歴(ls)にコマンドnしかなかったと考えています。今では、履歴には2つのコマンド(lspwd)があると考えています。あなたが-nそれを考えるとき(私は私の歴史に2つのコマンドがあり、.bash_historyに2つのコマンドがあるので、私は最新です。)
アーロン・マクデイド

3

私の経験では、シェルは終了時に履歴ファイルを更新しました。したがって、シェルの最初の「履歴」は、最後に終了したシェルの履歴のビューに依存していました。

この結果、他のシェルがどのように開始および停止したかに応じて、履歴からコマンドを送受信できます。


2
私は履歴ファイルがどのように書かれているかを非常によく理解しています-これが私が使用している私の質問で指定した理由ですhistappend。問題は予期しないコンテンツではなく、以前に保存されたコンテンツの完全な損失です。
カスカベル

私は私の歴史を失った理由は...説明
B七

1

これは以前にも見たことがありますが、頻度の増加に伴って発生していたディスクエラーの問題でした。ドライブでスキャンを実行します。ドライブが正常であることが判明した場合、このファイルが任意のシェル履歴制限を超えていないかどうかを確認します。

これを防ぐには、ファイルをプルーニングして80行に戻すか、履歴を必要とするコマンドの数を増やします。


私はこれが起こっているマシンにルートアクセス権を持っていませんが、私はドライブが大丈夫だとかなり確信しています。私のホームディレクトリは、私たちのラボのサーバー(多くのRAID、私が信じている)に保存され、nfsマウントされています。「任意のシェル履歴制限」とはどういう意味ですか?これはすべて、HISTSIZEおよびHISTFILESIZEよりもかなり下で発生します。両方を大きく設定しましたが、intbashがそれらを格納するよりもかなり下にあります。
カスカベル

デビッド・マッキントッシュのエントリーはおそらく起こっていることだと言わざるを得ないでしょう。
Axxmasterr

1
そうではないと確信しています。終了する最後のシェルに数十のコマンドがあり、履歴ファイルに数百があり、HISTSIZE / HISTFILESIZEが10000に設定されている場合、履歴に2つのコマンドだけが表示されることはありません。–
Cascabel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.