내 ~/.bashrc에 다음 줄이 있습니다.
export HISTCONTROL=ignoreboth:erasedups
그러나 실행할 때마다 다음과 같은 somecommand
중복 명령이 추가됩니다 ..bash_history
grep -w somecommand ~/.bash_history
somecommand
somecommand abc xyz
somecommand 123
somecommand
...
왜 이런 일이 발생하며 어떻게 예방할 수 있나요?
답변1
이 erasedups
옵션은 다음 두 가지 조건에 따라 중복 행을 제거합니다.
- 이 줄은 목록에서 제거됩니다.메모리.
- 새 명령이 목록에 추가되는 경우에만 해당됩니다.
메모리 내 목록이 출력입니다 history
. Bash가 닫히면
"메모리에 있는" 전체 목록이 파일에 기록됩니다(histappend가 설정되지 않은 경우).history -w
따라서 메모리에 있는 목록이 다음과 같다면:
$ history
1 cmd1
2 cmd2
3 cmd3
4 cmd1
5 cmd2
6 export HISTCONTROL=ignoreboth:erasedups
7 history
그것은 다음과 같습니다:
$ history
1 cmd2
2 cmd3
3 cmd2
4 export HISTCONTROL=ignoreboth:erasedups
5 cmd1
6 history
모든 cmd1 명령(추가된 명령 제외)이 제거됩니다.
실행 되면 cmd2
모든 중복 항목이 cmd2
제거됩니다(또한 ) history
.
$ cmd2
$ history
1 cmd3
2 export HISTCONTROL=ignoreboth:erasedups
3 cmd1
4 cmd2
5 history
하지만 지금도 파일은 ~/.bash_history
수정되지 않았습니다. 이전 세션의 명령 목록이 여전히 포함되어 있습니다. 파일에 grep을 사용하면 방금 사용한 명령(cmd1 및 cmd2)을 포함하여 많은 중복 항목(dups)이 표시될 수 있습니다. grep은 메모리 내 목록에서만 올바르게 작동합니다.
$ history | grep cmd1
목록이 파일에 기록되면(history -w) grep을 사용하면 세션에 사용된 각 명령줄의 인스턴스 하나만 찾습니다.
다음 명령을 사용하여 매번 디스크 파일을 강제로 업데이트할 수 있습니다.
$ PROMPT_COMMAND='history -w'
답변2
에 따르면 man bash
:
무시된 값으로 인해 이전 기록 항목과 일치하는 행이 저장되지 않습니다.
somecommand
인수 없이 연속으로 두 번 실행 하면 다음과 같은 결과만 표시됩니다.계속해서입구.
마찬가지로 somecommand 123
2번 연속으로 실행하면 히스토리에 1번만 추가됩니다.
목록의 명령에 no가 표시됩니다.계속해서복제되었으므로 이 기능은 예상대로 작동합니다.
답변3
각각의 새로운 명령을 고유하게 기록하는 것은 까다롭습니다. 먼저 다음을 추가하거나 유사하게 해야 합니다
~/.profile
.
HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'
그런 다음 다음을 추가해야 합니다 ~/.bash_logout
.
history -a
history -w