Bash 履歴: 'ignoredups' および 'erasedups' 設定がセッション全体の共通履歴と競合します。

Bash 履歴: 'ignoredups' および 'erasedups' 設定がセッション全体の共通履歴と競合します。

まず、これはSEの既存のスレッドと重複しません。私はこれら2つの記事を読みました(初めて2位)より良いbashの記録について説明しましたが、答えの中で何も機能しませんでした。 btw、私はFedora 15を使用しています。

私のユーザーディレクトリ(/home/aahan/)のファイルに以下を追加しましたが、うまくいきませ.bashrcんでした。誰に手がかりがありますか?

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

さて、これは私がbashの記録にしたいものです(優先順位):

  • 重複したアイテムは保存されず、既存のアイテムはすべて削除されます。
  • 開いているすべての端末と即座に履歴を共有する
  • 上書きするのではなく、常に履歴を追加してください。
  • 複数行のコマンドを単一のコマンドとして保存(デフォルトではオフ)
  • デフォルトの履歴サイズと履歴ファイルのサイズはいくらですか?

ベストアンサー1

これは実際に非常に興味深い行動であり、最初は問題を大幅に過小評価したことを認めます。しかし、最初の事実は次のとおりです。

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 -cPROMPT_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コマンドの出力を分析することから来ています。。ほとんどの場合、コマンドを発行できます。間違った出力。なぜ?なぜなら実行された今後historyに含まれる他のコマンドシーケンスPROMPT_COMMAND.bash_historyただし、2番目または3番目のオプションを使用すると、コンテンツの変更(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最後に必要ファイルから履歴バッファを回復することで、最終的に端末セッション間で履歴を共有できます。

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

おすすめ記事