bash: History -a HISTFILE에 이미 텍스트가 없으면 쓰지 않습니다.

bash: History -a HISTFILE에 이미 텍스트가 없으면 쓰지 않습니다.

문제 설명

나는 다음과 같이 bash 기록을 사용하여 창의적인 작업을 수행하는 수많은 예를 따라왔습니다.

# simplified example
PROMPT_COMMAND='history -a; history -c; history -r'

...하지만 간헐적으로 작동하는 것 같았습니다. 이전 기록과 함께 기록 파일이 이미 존재한다면 모든 것이 정상입니다.

기타 관련 정보

  • bash 버전: 3.2.51, 4.1.2 및 4.2.45
    • 4.2.x에는 이 문제가 없는 것으로 보이지만 기본 설치가 아닙니다.
  • OS: 리눅스 & 솔라리스
  • 홈 디렉토리가 NFS로 마운트되어 있습니다

진단 단계

나는 내 것을 제거 .bashrc하고 다음으로 설정했습니다 .bash_profile.

HISTFILE=$HOME/.bash_history.test

그런 다음 로그인 셸(예: 다른 컴퓨터에 대한 SSH)을 시작하고 다음과 같은 작업을 수행합니다.

~ cat .bash_history.test
cat: .bash_history.test: No such file or directory
~ history
    1  cat .bash_history.test
    2  history
~ history -a
~ !-3
cat .bash_history.test
cat: .bash_history.test: No such file or directory

history -a다음과 같은 상황에서는 기록 파일이 추가되지 않습니다 .

  • 파일이 이미 존재하지 않습니다.
  • 파일이 비어 있거나 개행 문자만 포함되어 있습니다. 공백조차도 작동하게 만듭니다.

... 그러나 쉘이 종료되면하다그것을 창조하십시오. 이후에는 history -a예상대로 작동합니다 PROMPT_COMMAND="history -a; history -c; history -r". 해당 설정이 있으면 쉘을 종료해도 기록 파일이 생성되지 않았습니다( exec bash먼저 실행하지 않는 한).

그런 다음 비표준 bash(4.2.x) 설치를 시도했지만 문제가 나타나지 않았습니다.

답변1

이 메일링 리스트 스레드이러한 문제를 설명하는 것으로 보입니다. 두 번째 메시지에서 인용:

bashhist.c:maybe_append_history()(최소 15년 동안 존재함)의 현재 코드는 현재 세션의 기록 행 수가 기록 목록 항목 수와 동일한 경우를 처리하지 못하는 것 같습니다. 즉, 셸이 시작될 때 기록 파일에서 읽은 줄이 없다고 생각되면 코드는 새 줄을 추가하지 않습니다. 잘못된 것 같아서 이를 수정하는 패치를 첨부했습니다. 그러나 코드가 현재의 형태로 너무 오랫동안 존재했기 때문에 다른 이유가 있는지 궁금합니다.

(Chet Ramey, GNU bash 메일링 리스트)

더욱이,변경 로그4.2의 경우 다음 텍스트가 있습니다.

+                  8/13
+                  ----
+bashhist.c
+   - in maybe_append_history, change check for history_lines_this_session
+     so that we append the lines to the file if it's equal to the value
+     returned by where_history().  This means that without this change,
+     the history won't be appended if all the lines in the history list
+     were added in the current session since the last time the history
+     file was read or written.  Fixes bug reported by Bruce Korb
+     <[email protected]>

(git.savannah.gnu.org, bash git repo)

분명히 이 문제를 해결하려면 최신 버전의 bash를 설치해야 합니다.

이것이 다른 누군가에게 도움이 되기를 바랍니다.

관련 정보