Bash가 여전히 중복된 줄을 삭제하여 유지하는 이유는 무엇입니까?

Bash가 여전히 중복된 줄을 삭제하여 유지하는 이유는 무엇입니까?

내 ~/.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 1232번 연속으로 실행하면 히스토리에 1번만 추가됩니다.

목록의 명령에 no가 표시됩니다.계속해서복제되었으므로 이 기능은 예상대로 작동합니다.

답변3

각각의 새로운 명령을 고유하게 기록하는 것은 까다롭습니다. 먼저 다음을 추가하거나 유사하게 해야 합니다 ~/.profile.

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

그런 다음 다음을 추가해야 합니다 ~/.bash_logout.

history -a
history -w

관련 정보