ステップ
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.
批評家
私は$HISTSIZE
bashレコードの最後の数行にもはや重複するエントリが含まれていないと予想しました(exit
開始と数回のサイクルでbash
)。
私の行動や家庭で何が間違っていますか?
注:同様の結果で設定を試みましたHISTCONTROL=erasedups
。つまり、重複項目を保持します(連続重複項目はテストしていません)。
答え1
管理者であるChet Chet Rameyが提供しています。GNU バッシュエラー:
Erasedups機能は正常に動作します。つまり、メモリに保存されている履歴リストから一致するコマンドを削除します。シェルが終了すると、デフォルトでは現在の履歴リストが履歴ファイルに追加されます。履歴ファイルを完全に強制的に再作成するには、シェルの終了時に
history -w
使用して再作成できます。残念ながら、現時点ではこの動作を強制する簡単な方法はありませんrewrite-at-exit
。
また、アイテムは実際に再利用した場合にのみ削除されます。
したがって、次のような場合に該当するものを見つける必要があります。
- 新しいシェルの起動
- 実装する
ssh-add -l
- 実装する
history -w
それならssh-add -l
あなたでしょう~/.bash_history file
。
この問題をどのように解決しますか?すべての重複エントリを定期的に削除するにはどうすればよいですか?これは別の質問ですが、次のことが役に立ちます。