GNU/Linux >> Linux の 問題 >  >> Linux

Bashの履歴:「ignoredups」と「erasedups」は、セッション間で共通の履歴と競合しますか?

まず第一に、これは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つの欠点があります。

  1. ログイン(端末を開く)時に、履歴ファイルの最後のコマンドが現在の端末の履歴バッファに2回読み込まれます。
  2. 異なる端末のバッファは履歴ファイルと同期していません。
  • オプション2:

     HISTCONTROL=ignoredups
     PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
    

(はい、shopt -s histappendは必要ありません はい、必要があります history -c PROMPT_COMMANDの途中 )
このバージョンには、2つの重要な欠点もあります。

  1. 履歴ファイルを初期化する必要があります。 少なくとも1行の空でない行が含まれている必要があります (何でもかまいません)。
  2. 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 必要 ファイルから履歴バッファを復元し、最終的に端末セッション間で履歴を共有します。

このソリューションでは、現在の端末に入力された最新のコマンドの前に他の端末からのすべての履歴を配置することにより、履歴の順序が混乱することに注意してください。また、そのコマンドを再度入力しない限り、履歴ファイルにすでに存在する重複行は削除されません。


Linux
  1. Linuxスクリプトコマンドを使用してターミナルセッションをキャプチャして出力する方法

  2. Bash を使用してファイルを検索してコピーする

  3. bash履歴を使用して前のコマンドを取得し、それをコピーしてから「実行」しますが、コマンドはコメント化されています

  1. bash の改行でテキストをエコーする

  2. Bash履歴ファイルから特定の行を削除します

  3. <() の bash (および =() の zsh) とは正確には何ですか?

  1. これらのヒントを使用して、Bashの履歴をより便利にします

  2. Bashでプログラミングする方法:構文とツール

  3. LinuxでのBash履歴での単語修飾子の使用