bash 기록이 지워지는 것을 방지하는 방법은 무엇입니까?

bash 기록이 지워지는 것을 방지하는 방법은 무엇입니까?

따르다답변:

동시에 여러 bash 인스턴스를 닫을 때 기록이 지워질 수 있는 알려진 경쟁 조건이 있습니다. 이는 bash 기록 파일을 작성할 때 잠금이 사용되지 않기 때문에 발생합니다.

bash 기록 삭제를 방지하는 방법은 무엇입니까?

urxvt저는 i3wm을 사용하는데 터미널을 수동으로 닫기 전에 컴퓨터를 종료할 때 이런 일이 주로 발생한다고 생각합니다 . (키 바인딩을 통한) 종료 명령은 입니다 systemctl poweroff.

답변1

경쟁 조건의 원인은 bash가 쉘이 종료될 때만 기록 파일에 기록한다는 것입니다. 또한 여러 셸이 실행 중인 경우 기존 기록 파일을 덮어쓰며 마지막으로 종료된 셸만 기록을 지배하게 됩니다.

따라서 한 가지 해결책은 각 명령 뒤에 기록을 작성하는 것입니다. 이렇게 하면 화살표를 위로 올려 다른 창에서 발생한 기록 이벤트를 볼 수 있으므로 방금 실행한 명령이 열려 있는 모든 셸(있는)에 노출되는 등 부정적인 결과가 발생할 수 있습니다. 이런 일이 발생할 가능성이 가장 높은 곳은 "위로 화살표를 N 번 누른 후 Enter 누르기"와 같은 반복적인 명령 세트를 계속해서 실행하는 경우입니다. 백그라운드 프로세스가 닫힌 창에서 끝나면 갑자기 어떤 명령이 실제로 "N+1번 위쪽 화살표"인지 주의 깊게 살펴보아야 하며, 이는 잘못된 명령을 실행할 위험이 있습니다.

"명령당 기록"을 켜려면 이를 .bashrc에 추가해 보십시오(저장할 기록 행 수는 단지 예일 뿐이며 원하는 경우 변경할 수 있습니다).

HISTFILESIZE=400000000
HISTSIZE=10000
PROMPT_COMMAND="history -a"
export HISTSIZE PROMPT_COMMAND

shopt -s histappend

답변2

Bash를 시작하면 기록이 삭제되었는지 경고합니다(라인 수로 측정). 기록이 삭제되지 않은 경우 백업이 생성됩니다.

~/.bashrc

# backup history/warn about deleted history
if (( $(wc -l < ~/.bash_history) < 1100 ))
then
    echo "#########################"
    echo ".bash_history was cleared"
    echo "#########################"
else
    cp ~/.bash_history ~/.bash_history.back
fi

답변3

내 해결책은 로그아웃하기 전에 메모리 내 기록을 디스크 내 기록과 병합하는 것이었습니다...

기록 타임스탬프 순서와 해당 타임스탬프 내의 명령 순서를 유지하면서 이 작업을 수행합니다.

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

이것이 결과입니다 ...https://antofthy.gitlab.io/software/history_merge.bash.txt

쉘 별칭 "hc"(기록 정리용)를 통해 "요청 시" 스크립트를 가져오고 종료하기 전에 ".bash_logout" 구성 파일에서 병합/정리합니다.

즐기다.

관련 정보