私の~/.bashrcには次の行があります。
export HISTCONTROL=ignoreboth:erasedups
ただし、実行するたびに、次のようなsomecommand
冗長コマンドが追加されます。.bash_history
grep -w somecommand ~/.bash_history
somecommand
somecommand abc xyz
somecommand 123
somecommand
...
なぜこれが起こり、どのように予防できますか?
ベストアンサー1
このerasedups
オプションは、次の2つの条件に基づいて重複行を削除します。
- この行はリストから削除されます。メモリ。
- 新しいコマンドがリストに追加された場合にのみ適用されます。
メモリ内のリストが出力ですhistory
。 Bashが閉じられると、
「メモリ内の」リスト全体がファイルに書き込まれます(histappendが設定されていない場合)。history -w
したがって、メモリ内のリストが次のような場合:
$ history
1 cmd1
2 cmd2
3 cmd3
4 cmd1
5 cmd2
6 export HISTCONTROL=ignoreboth:erasedups
7 history
それは次のとおりです。
$ history
1 cmd2
2 cmd3
3 cmd2
4 export HISTCONTROL=ignoreboth:erasedups
5 cmd1
6 history
すべてのcmd1コマンド(追加されたコマンドを除く)が削除されます。
実行すると、cmd2
すべての重複エントリがcmd2
削除されます(また)history
。
$ cmd2
$ history
1 cmd3
2 export HISTCONTROL=ignoreboth:erasedups
3 cmd1
4 cmd2
5 history
しかし、今でもファイルは~/.bash_history
変更されていません。前のセッションのコマンドのリストがまだ含まれています。ファイルにgrepを使用すると、使用したコマンド(cmd1とcmd2)を含む多くの重複エントリ(dups)が表示されることがあります。 grep はメモリ内リストでのみ正しく動作します。
$ history | grep cmd1
リストがファイルに書き込まれると(history -w)、grepを使用すると、セッションで使用されている各コマンドラインの1つのインスタンスのみが検索されます。
次のコマンドを使用して、毎回ディスクファイルを強制的に更新できます。
$ PROMPT_COMMAND='history -w'