때때로 명령 기록이 .bash_history에 저장되지 않습니다.

때때로 명령 기록이 .bash_history에 저장되지 않습니다.

어제 저는 CentOS 7에서 많은 명령을 실행했습니다. 그런데 오늘 이 명령을 검색하려고 했을 때 기록이 없다는 것을 발견했습니다. 파일을 열어보니 .bash_history어제 내린 명령어는 여전히 찾을 수 없지만, 며칠 전의 오래된 명령어는 많이 찾아볼 수 있었습니다. 최근 명령이 저장되지 않는 이유는 무엇입니까? 이력 기록 기능을 향상시키는 방법은 무엇입니까?

답변1

기록 항목이 표시되지 않는 가장 큰 이유는 HISTFILE비어 있거나 HISTSIZE0으로 설정되지 않고 동일한 시스템에 두 번 로그인하고 두 번째 bash 인스턴스(거의 아무것도 수행하지 않은) 이후에 종료되었기 때문입니다. 많은. 기본적으로 Bash는 기록을 병합하지 않으며 두 번째 Bash 종료는 .bash_history첫 번째 Bash 종료에 의해 적절하게 업데이트된 기록을 덮어씁니다.

이런 일이 발생하지 않도록 하려면 기록 파일을 덮어쓰는 대신 기록 파일에 추가할 수 있습니다. histappend셸 옵션을 사용할 수 있습니다.

histappend 셸 옵션이 활성화된 경우(아래 SHELL BUILTIN COMMANDS 아래의 shopt 설명 참조), 이 줄은 기록 파일에 추가되고, 그렇지 않으면 기록 파일을 덮어쓰게 됩니다.

자세한 내용은 다음을 참조하세요.이 답변사용 방법 HISTSIZE, 크기 HISTFILESIZE제어 HISTCONTROL, 중복 등이 포함되어 있습니다.

답변2

히스토리 크기를 수정하려면 HISTSIZE두 개의 BASH 변수 HISTFILESIZE(일반적으로 에서 설정됨 .bashrc)를 사용하십시오.

BASH 매뉴얼 페이지의 설명:

역사적 규모 명령 기록에 기억해야 할 명령의 개수입니다(아래 "기록" 참조). 값이 0이면 명령이 기록 목록에 저장되지 않습니다. 0보다 작은 값을 사용하면 각 명령이 기록 목록에 제한 없이 저장됩니다. 쉘은 시작 파일을 읽은 후 기본값을 500으로 설정합니다.

기록 파일 크기 기록 파일에 포함되는 최대 줄 수입니다. 이 변수에 값이 할당되면 필요한 경우 가장 오래된 항목을 제거하여 해당 행 수만 포함하도록 기록 파일이 잘립니다. 쉘이 종료되면 기록 파일도 작성된 후 이 크기로 잘립니다. 값이 0이면 기록 파일이 0 크기로 잘립니다. 숫자가 아닌 값과 0보다 작은 숫자 값은 잘림이 금지됩니다. 쉘은 시작 파일을 읽은 후 기본값을 HISTSIZE 값으로 설정합니다.

.bashrc예를 들어, 내 파일 에는 다음과 같은 설정이 있습니다 .

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

답변3

쉘 변수가 또는 HISTCONTROL로 설정되어 있지 않은지 확인하십시오 .ignorespaceignoreboth

$ echo $HISTCONTROL
ignoredups  #this is ok

~/.bash_profile귀하 또는 귀하의 파일 ~/.profile에 값을 설정하여 수정할 수 있습니다.

HISTCONTROL=ignoredups

bash매뉴얼 페이지 에서 :

조직 통제

명령이 기록 목록에 저장되는 방식을 제어하는 ​​콜론으로 구분된 값 목록입니다.

값 목록에 가 포함된 경우 ignorespace공백 문자로 시작하는 줄은 기록 목록에 저장되지 않습니다.

값을 지정 ignoredups하면 이전 기록 항목과 일치하는 행이 저장되지 않습니다.

의 값은 and 의 약어 ignoreboth입니다 .ignorespaceignoredups

값을 erasedups지정하면 행을 저장하기 전에 현재 행과 일치하는 모든 이전 행이 기록 목록에서 제거됩니다.

위 목록에 없는 값은 무시됩니다.

이 설정되지 않았거나 유효한 값을 포함하지 않는 경우 HISTCONTROL 쉘 파서가 읽은 모든 행은 값에 따라 기록 목록에 저장됩니다 HISTIGNORE. 여러 줄 복합 명령의 두 번째 및 후속 줄은 테스트되지 않으며 값에 관계없이 기록에 추가됩니다 HISTCONTROL.

답변4

OP와 마찬가지로 여러 터미널과 종료될 수 있는 "무작위 순서"로 인해 기록이 손실되는 것이 짜증납니다. 한 터미널에서 다른 터미널로 기록을 전송할 수 있기를 원하지만 필요할 때만 지속적으로 수행하거나 쉘이 종료될 때 저장하여 다른 터미널과 병합하는 것을 원하지 않습니다.

결과는 이렇습니다...

디스크의 ".bash_history"를 메모리의 셸 "history"와 병합합니다. 타임스탬프의 순서와 해당 타임스탬프 내의 명령 순서는 유지됩니다.

정의된 Perl RE에 따라 고유한 명령(여러 줄 포함)을 제거하거나 단순하고 민감한 명령을 제거(지우기)하는 옵션이 있습니다. 맞게 조정하세요!

https://antofthy.gitlab.io/software/history_merge.bash.txt

".bash_logout"에서 스크립트를 가져오기 위해 별칭 "hc"를 사용하지만, 기록 저장을 끄지 않는 경우에만($HISTFILE 설정 해제 - 경우에 따라 "비공개" 쉘 세션).

즐기다.

관련 정보