`export PROMPT_COMMAND='history -a'` 및 `HISTControl=ignoredups:erasedups`를 해결할 수 있는 방법이 있나요?

`export PROMPT_COMMAND='history -a'` 및 `HISTControl=ignoredups:erasedups`를 해결할 수 있는 방법이 있나요?

export PROMPT_COMMAND='history -a'이 문제를 해결할 방법이 있나요 HISTCONTROL=ignoredups:erasedups?

다른 Bash 쉘 탭을 열면서 전자를 사용하여 현재 저장되지 않은 기록 줄을 가져왔지만 불행히도 중복된 줄이 추가되는 것 같았습니다. HISTControl 옵션은 쉘이 닫힐 때만 적용되는 것 같습니다. 예를 들어, history중복 항목을 나열할 수는 있지만 볼 수는 없지만 cat .bash_history볼 수는 있습니다.

shopt -s histappend따라서 기본적으로 또는 다른 설정에 따라 종료 시 메모리나 임시 저장소의 중복 제거 기록만 .bash_history에 저장된다고 가정합니다 .

추가하기 전에 중복 제거된 기록을 쓸 수 있는지 확인 하려고 했지만 export PROMPT_COMMAND='history -w; history -a'작동하지 않았습니다.

답변1

그렇지 않은 경우 history -w(BTW는 연속 중복만 제거합니다.) 이로 인해 모든 쉘은 모든 새 프롬프트(Enter 또는 Break 누르기)에서 동일한 거의 실시간 기록을 공유하게 되며 이는 탭에서 별도로 처리됩니다. 이상적인.

인기 있는 질문은 공통 기록을 사용하면서 중복 제거 문제를 해결하는 방법입니다.Bash 기록: 'ignoredups' 및 'erasedups' 설정이 세션 전체의 공통 기록과 충돌합니다.

실시간 공동 기록은 필요하지 않지만 기록을 저장하고 새 셸에 제대로 적용하고 싶습니다. history -a이 작업을 수행. export PROMPT_COMMAND='history -a'최소한 각 프롬프트의 기록을 저장 하십시오 . (BTW, -w는 파일에서 쉘 목록을 쓰고, -a는 목록을 파일에 추가합니다.)

따라서 실시간 기록 없이 중복 항목을 제거하는 유일한 방법은 명령을 이용하는 것입니다. (원래 이것을 cronjob에 넣을 예정이었지만 지금은 필요하지 않은 것 같습니다. 하단의 편집 설명을 참조하십시오.)

tac $HISTFILE | cat -n | sort -k2 -k1n | uniq -f1 | sort -nk1,1 | cut -f2- | tac > $HISTFILE

file1="/etc/cron.daily/bash_history_dedup"; echo '<command>' $file1; chmod +x $file1

cron 작업을 사용하여 기록 파일(사용자, 루트 x 매일, 매월)을 백업할 수도 있습니다.

file1="/etc/cron.daily/backup_bash_history"; echo -e 'cp --force ~/.bash_history ~/.bash_history_bak" \nsu user -c "cp --force ~/.bash_history ~/.bash_history_bak"' > $file1 && chmod +x $file1

file1="/etc/cron.monthly/backup_bash_history"; echo -e 'cp --force ~/.bash_history ~/.bash_history_bak_monthly \nsu user -c "cp --force ~/.bash_history ~/.bash_history_bak_monthly"' > $file1 && chmod +x $file1

해당 명령을 사용하여 중복을 제거한 후에는 더 이상 중복 항목이 표시되지 않습니다. 따라서 이전에 저장된 기록 목록에 이러한 항목이 존재할 수 있습니다. 삭제된 내용은 이에 영향을 미치지 않습니다.

그런데 저는 이것이 인수 없이 명령을 건너뛰는 데 도움이 된다는 것을 알았습니다. export HISTIGNORE="!(+(*\ *))"# 인수 없는 명령을 무시합니다. HISTTIMEFORMAT과 호환되지 않습니다. 동일해야합니다grep -v -E "^\S+\s.*" $HISTFILE

답변2

문제는 "원자적" 추가입니다. 중간 지점 history -a은 "old"에서는 수동이고 history -nnew bash에서는 수동입니다. (이렇게 하면 새 명령 내에서 기존 세션 명령이 숨겨집니다. 이름이 지정된 파일에 추가하여 기록을 연결할 수 있습니다.)

관련 정보