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