어제 저는 CentOS 7에서 많은 명령을 실행했습니다. 그런데 오늘 이 명령을 검색하려고 했을 때 기록이 없다는 것을 발견했습니다. 파일을 열어보니 .bash_history
어제 내린 명령어는 여전히 찾을 수 없지만, 며칠 전의 오래된 명령어는 많이 찾아볼 수 있었습니다. 최근 명령이 저장되지 않는 이유는 무엇입니까? 이력 기록 기능을 향상시키는 방법은 무엇입니까?
답변1
기록 항목이 표시되지 않는 가장 큰 이유는 HISTFILE
비어 있거나 HISTSIZE
0으로 설정되지 않고 동일한 시스템에 두 번 로그인하고 두 번째 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
로 설정되어 있지 않은지 확인하십시오 .ignorespace
ignoreboth
$ echo $HISTCONTROL
ignoredups #this is ok
~/.bash_profile
귀하 또는 귀하의 파일 ~/.profile
에 값을 설정하여 수정할 수 있습니다.
HISTCONTROL=ignoredups
bash
매뉴얼 페이지 에서 :
조직 통제
명령이 기록 목록에 저장되는 방식을 제어하는 콜론으로 구분된 값 목록입니다.
값 목록에 가 포함된 경우
ignorespace
공백 문자로 시작하는 줄은 기록 목록에 저장되지 않습니다.값을 지정
ignoredups
하면 이전 기록 항목과 일치하는 행이 저장되지 않습니다.의 값은 and 의 약어
ignoreboth
입니다 .ignorespace
ignoredups
값을
erasedups
지정하면 행을 저장하기 전에 현재 행과 일치하는 모든 이전 행이 기록 목록에서 제거됩니다.위 목록에 없는 값은 무시됩니다.
이 설정되지 않았거나 유효한 값을 포함하지 않는 경우
HISTCONTROL
쉘 파서가 읽은 모든 행은 값에 따라 기록 목록에 저장됩니다HISTIGNORE
. 여러 줄 복합 명령의 두 번째 및 후속 줄은 테스트되지 않으며 값에 관계없이 기록에 추가됩니다HISTCONTROL
.
답변4
OP와 마찬가지로 여러 터미널과 종료될 수 있는 "무작위 순서"로 인해 기록이 손실되는 것이 짜증납니다. 한 터미널에서 다른 터미널로 기록을 전송할 수 있기를 원하지만 필요할 때만 지속적으로 수행하거나 쉘이 종료될 때 저장하여 다른 터미널과 병합하는 것을 원하지 않습니다.
결과는 이렇습니다...
디스크의 ".bash_history"를 메모리의 셸 "history"와 병합합니다. 타임스탬프의 순서와 해당 타임스탬프 내의 명령 순서는 유지됩니다.
정의된 Perl RE에 따라 고유한 명령(여러 줄 포함)을 제거하거나 단순하고 민감한 명령을 제거(지우기)하는 옵션이 있습니다. 맞게 조정하세요!
https://antofthy.gitlab.io/software/history_merge.bash.txt
".bash_logout"에서 스크립트를 가져오기 위해 별칭 "hc"를 사용하지만, 기록 저장을 끄지 않는 경우에만($HISTFILE 설정 해제 - 경우에 따라 "비공개" 쉘 세션).
즐기다.