まず第一に、これはSE上の既存のスレッドの複製ではありません。私はこれらの2つのスレッド(1番目と2番目)をより良いbash履歴で読みましたが、答えはどれも機能しません– –ちなみに私はFedora15を使用しています。
.bashrc
に以下を追加しました ユーザーディレクトリ(/ home / aahan /)にファイルがあり、機能しません。誰か手がかりがありますか?
HISTCONTROL=ignoredups:erasedups # no duplicate entries
HISTSIZE=1000 # custom history size
HISTFILESIZE=100000 # custom history file size
shopt -s histappend # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND" # Save and reload the history after each command finishes
さて、これは私がバッシュの歴史(優先順位)で欲しいものです:
- 重複を保存しないでください。既存のものを消去してください
- 開いているすべての端末とすぐに履歴を共有する
- 履歴を上書きするのではなく、常に追加します
- 複数行のコマンドを単一のコマンドとして保存します(デフォルトではオフになっています)
- デフォルトの履歴サイズと履歴ファイルサイズはどれくらいですか?
承認された回答:
これは実際には非常に興味深い行動であり、最初の質問を大幅に過小評価していたことを告白します。しかし、最初に事実:
1。何が機能するか
機能はいくつかの方法で実現できますが、それぞれの動作は少し異なります。いずれの場合も、履歴を別の端末に「転送」(更新)するには、 Enterを押す必要があることに注意してください。 ターミナルで、履歴を取得したい場所です。
-
オプション1:
shopt -s histappend HISTCONTROL=ignoredups PROMPT_COMMAND="history -a; history -n; $PROMPT_COMMAND"
これには2つの欠点があります。
- ログイン(端末を開く)時に、履歴ファイルの最後のコマンドが現在の端末の履歴バッファに2回読み込まれます。
- 異なる端末のバッファは履歴ファイルと同期していません。
-
オプション2:
HISTCONTROL=ignoredups PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
(はい、shopt -s histappend
は必要ありません はい、必要があります history -c
PROMPT_COMMAND
の途中 )
このバージョンには、2つの重要な欠点もあります。
- 履歴ファイルを初期化する必要があります。 少なくとも1行の空でない行が含まれている必要があります (何でもかまいません)。
history
コマンドは誤った出力を与える可能性があります–以下を参照してください。
[編集] 「そして勝者は…」
-
オプション3:
HISTCONTROL=ignoredups:erasedups shopt -s histappend PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"
これは可能な限りです。 のみです 両方のerasedups
を持つオプション と共通の歴史が同時に働いています。 これ おそらく最終的な解決策です すべての問題に、アーハン。
2。なぜオプション2 うまくいかないようです(または:実際に 期待どおりに機能しません)?
前述したように、上記のソリューションはそれぞれ動作が異なります。ただし、設定がどのように機能するかについての最も誤解を招く解釈は、history
の出力を分析することから得られます。 コマンド 。多くの場合、コマンドは falseを与える可能性があります 出力。なんで? 実行されるのは前だからです 他のhistory
のシーケンス PROMPT_COMMAND
に含まれるコマンド ! ただし、2番目または3番目のオプションを使用すると、.bash_history
の変更を監視できます。 コンテンツ(watch -n1 "tail -n20 .bash_history"
を使用 たとえば)そして実際の歴史が何であるかを見てください。
3。なぜオプション3 とても複雑ですか?
それはすべてerasedups
の方法にあります 動作します。 bashマニュアルに記載されているように、“(…)erasedups
現在の行に一致する前のすべての行が、その行が保存される前に履歴リストから削除されます。」 。つまり、これは本当にOPが望んでいたことです(そして、以前考えていたように、順番に重複が表示されないようにするだけではありません。 ) 。これが、各history -.
の理由です。 コマンドは、PROMPT_COMMAND
に含める必要があるか、含めることができません。 :
-
history -n
持っているhistory -w
の前に存在する.bash_history
から読み取る 他の端末から保存されたコマンド -
history -w
持っている コマンドが重複しているかどうかをbashがチェックした後、新しい履歴をファイルに保存するためにそこにあります。 -
history -a
してはいけないhistory -w
の代わりにそこに配置されます 、重複としてチェックされたかどうかに関係なく、新しいコマンドがファイルに追加されるためです。 -
history -c
必要もあります 各コマンドの後に履歴バッファを破棄するのを防ぐためです。 -
そして最後に、
history -r
必要 ファイルから履歴バッファを復元し、最終的に端末セッション間で履歴を共有します。
このソリューションでは、現在の端末に入力された最新のコマンドの前に他の端末からのすべての履歴を配置することにより、履歴の順序が混乱することに注意してください。また、そのコマンドを再度入力しない限り、履歴ファイルにすでに存在する重複行は削除されません。