"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.

이 문제를 어떻게 해결하나요? 모든 중복 항목을 정기적으로 제거하려면 어떻게 해야 합니까? 이것은 또 다른 질문이지만 다음이 도움이 될 수 있습니다.

관련 정보