「erasedups」が期待どおりに機能しないのはなぜですか?

「erasedups」が期待どおりに機能しないのはなぜですか?

ステップ

sam@x230:~$ grep -E '^VERSION=|^NAME=' /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
sam@x230:~$ echo ${BASH_VERSINFO[@]}
5 0 17 1 release x86_64-pc-linux-gnu
sam@x230:~$ tail -n $HISTSIZE ~/.bash_history  |grep '^ssh-add -l$' |wc -l
10
sam@x230:~$ grep -i hist .bashrc |egrep -v '^alias|^\s*#'
HISTCONTROL=ignoreboth
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=20000
sam@x230:~$  sed 's/\(ignoreboth\)$/\1:erasedups/' ~/.bashrc
sam@x230:~$ grep HISTCONTROL ~/.bashrc
HISTCONTROL=ignoreboth:erasedups
sam@x230:~$ export HISTCONTROL=ignoreboth:erasedups
sam@x230:~$ set |grep HIST
HISTCONTROL=ignoreboth:erasedups
HISTFILE=/home/sam/.bash_history
HISTFILESIZE=20000
HISTSIZE=1000

シーン1:

sam@x230:~$ echo $HISTCONTROL
ignoreboth:erasedups
sam@x230:~$ ssh-add -l
256 SHA256:5FGaVpklzgSA1r/X8lb4SFaZ9hN0OfQXy+HOWpidcs4 default.sam@x230 (ED25519)
sam@x230:~$ tail -n $HISTSIZE ~/.bash_history  |grep '^ssh-add -l$' |wc -l
10
sam@x230:~$ exit

新しいターミナルの悲劇的な終わり:

sam@x230:~$ echo $HISTCONTROL
ignoreboth:erasedups
sam@x230:~$  tail -n $HISTSIZE ~/.bash_history  |grep '^ssh-add -l$' |wc -l
11

専門家

によるとman bash

HISTCONTROL
              A colon-separated list of values controlling  how  commands  are
              saved  on  the history list.  If the list of values includes ig‐
              norespace, lines which begin with  a  space  character  are  not
              saved  in  the history list.  A value of ignoredups causes lines
              matching the previous history entry to not be saved.  A value of
              ignoreboth is shorthand for ignorespace and ignoredups.  A value
              of erasedups causes all previous lines matching the current line
              to  be  removed from the history list before that line is saved.
              Any value not in the above list is ignored.  If  HISTCONTROL  is
              unset,  or does not include a valid value, all lines read by the
              shell parser are saved on the history list, subject to the value
              of  HISTIGNORE.  The second and subsequent lines of a multi-line
              compound command are not tested, and are added  to  the  history
              regardless of the value of HISTCONTROL.

批評家

私は$HISTSIZEbashレコードの最後の数行にもはや重複するエントリが含まれていないと予想しました(exit開始と数回のサイクルでbash)。

私の行動や家庭で何が間違っていますか?

注:同様の結果で設定を試みましたHISTCONTROL=erasedups。つまり、重複項目を保持します(連続重複項目はテストしていません)。

答え1

管理者であるChet Chet Rameyが提供しています。GNU バッシュエラー:

Erasedups機能は正常に動作します。つまり、メモリに保存されている履歴リストから一致するコマンドを削除します。シェルが終了すると、デフォルトでは現在の履歴リストが履歴ファイルに追加されます。履歴ファイルを完全に強制的に再作成するには、シェルの終了時にhistory -w使用して再作成できます。残念ながら、現時点ではこの動作を強制する簡単な方法はありませんrewrite-at-exit

また、アイテムは実際に再利用した場合にのみ削除されます。

したがって、次のような場合に該当するものを見つける必要があります。

  1. 新しいシェルの起動
  2. 実装するssh-add -l
  3. 実装するhistory -w

それならssh-add -lあなたでしょう~/.bash_history file

この問題をどのように解決しますか?すべての重複エントリを定期的に削除するにはどうすればよいですか?これは別の質問ですが、次のことが役に立ちます。

関連情報