Bashレコードの重複

Bashレコードの重複

私の中には次のものがあります~/.bashrc

HISTCONTROL=ignoreboth:erasedups

しかし、私の記録には重複項目がたくさん含まれています。たとえば、5つの項目がありますsudo apt-get upgrade

私はRaspbian Jessie主にを通じて実行してアクセスしていますssh

PSこの記事を書いて、私はちょうど入力しましたが、sudo apt-get upgrade項目は1つだけです。理由をご存知ですか?どうやって予防できますか?

答え1

どちらも無視したのでクリアする必要はありません。

Ignoreboth は冗長コマンドと空のコマンドを処理します。

両方を無視するか、重複項目を削除してみてください。

"HISTCONTROL=ignoreboth"

これを使用してbashをリロードします。ありがとうございます。

答え2

それぞれの新しいコマンドを一意に記録するのは難しいです。まず、次のものを追加するか、類似する必要があります ~/.profile

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

次に、以下を追加する必要があります~/.bash_logout

history -a
history -w

答え3

持つ二つコマンドリスト:

  • 記憶の中に。
  • ファイルから。

HISTControl の設定はメモリのリストに従って動作します。オプションなしでコマンドでリストを表示できます history。コマンドを入力するとリストに追加されます。追加するコマンドがリストの最後のコマンドと同じで、ignoredupsこのオプションが設定されている場合、またはerasedupsこのオプションが設定されている場合、コマンドは削除されます。この場合、両方のオプションにはいくつかの類似点があります。このオプションを設定する
と、erasedupsこのコマンドより前のすべてのエントリがメモリリストから削除されます(ただしファイルからは削除されません)。この削除はただ新しい重複コマンドが発生しました。つまり、新しいコマンドがリストに追加されるまで、冗長コマンドは保持されます。

ファイルにメモリのリストを書き込むには、次のコマンドを使用できますhistory -w(ファイル全体を新しいコピーに置き換えます)。ファイルのリストは記録されるまで更新されません。または、追加history -a(以前に追加されなかった新しい行のみが追加され、ファイルに以前の重複コマンドが残ることがあります)。このオプションは、bashが終了したときにhistappendファイルを置き換えるか追加することを選択します。追加すると、冗長コマンドが変更されないことがあります。

ファイルリストを整理する1つの方法(コマンドの最後のエントリを保持)は次のとおりです。

$ history | sort -urk2 | sort -n | sed 's/^ \+[0-9]\+ \+//'  >~/.bash_history

history -w各コマンドをファイルに追加する1つの方法は、プロンプトコマンドbash変数を使用して各新しいコマンドラインで実行することです。

$ PROMPT_COMMAND='history -w'

~/.bashrc自動的に実行するには、次のコマンドをすべて(通常はLinuxで)または~/.profile(通常はMacで)追加する必要があります。

HISTFILE=${HISTFILE:-~/.bash_history}
HISTCONTROL=ignoreboth:erasedups
PROMPT_COMMAND='history -w'
nl "$HISTFILE"|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2- >"${HISTFILE}.temp" && mv "$HISTFILE"{.temp,}
history -c; history -r

関連情報