여러 세션을 실행할 때 이상한 bash 기록 동작 줄 기록은 어떻게 저장됩니까? 나는

여러 터미널 창을 사용할 때 명령 줄 기록은 어떻게 저장됩니까? 나는 그것이 저장된다는 것을 알고 .bash_history있지만 새 창을 열면 어떤 기록이 사용되는지에 대한 논리를 볼 수 없습니다. 새 창에서 위쪽 화살표를 사용하려고하면 어떤 명령을 볼지 알 수 없다는 의미에서 비 결정적이라고 생각합니다.

누군가 이것을 설명 할 수 있습니까?

특정 창에서 히스토리를 재사용 할 수있는 방식으로 히스토리를 제어하는 ​​방법이 있습니까?



답변

bash 기록의 동작을 이해하려면 먼저 다음을 알아야합니다.

  1. 히스토리 파일에 히스토리가 있습니다.
  2. bash 프로세스의 메모리에 히스토리가 있습니다.
  3. 한 bash 프로세스의 메모리 히스토리는 다른 bash 프로세스의 메모리 히스토리와 동기화되지 않습니다.
  4. bash 프로세스 메모리의 히스토리는 특정 이벤트에 대해 명시 적으로 요청되거나 특정 이벤트가 발생하지 않는 한 파일의 히스토리와 동기화되지 않습니다 (아래 참조).

기본 설정을 사용하면 히스토리와 관련된 bash 세션의 수명주기는 다음과 같습니다.

  1. 시작하는 동안 bash는 기록 파일을 읽습니다. 히스토리 파일의 컨텐츠는 이제 bash 프로세스의 메모리에 있습니다.
  2. 정상적인 사용 중에는 메모리의 기록 만 조작됩니다.
  3. 종료하는 동안 메모리의 기록이 기록 파일에 기록되고 기록 파일의 이전 내용을 덮어 씁니다.

당신이 관찰 한 겉보기 비결정론 적 행동은 대부분 히스토리 파일의 내용이 항상 마지막 닫힌 bash 세션의 히스토리이고 bash는 시작 중에 히스토리 파일 만 읽기 때문입니다.

시작 및 종료 프로세스에 대한 자세한 설명은 bash 매뉴얼 을 읽으십시오 .

기본 설정에서는 bash의 기본 설정을 의미합니다. 배포판 에서이 동작을 변경 하는 .bashrc(또는 /etc/bash.bashrc)를 제공했을 수 있습니다 .

쉘 옵션 histappend을 사용하면 히스토리 파일을 덮어 쓰지 않고 bash에게 추가하도록 지시 할 수 있습니다. histappend명령을 사용 하여 활성화 할 수 있습니다 shopt -s histappend. 이 옵션을 항상 활성화하려면 명령 .bashrc(또는 다른 초기화 파일)에 명령을 넣어야합니다 . shopt명령에 대한 자세한 내용 은bash 매뉴얼

가능 histappend하게하는 것이 비결정론적인 행동을 많이 감소 시키지는 않습니다. 모든 bash 세션에는 여전히 메모리에 자체 기록이 있기 때문입니다. 대부분 동기화 된 bash 기록이있을 수 있습니다. 모든 bash 프로세스가 스택 오버플에서 스레드 에서 대부분 동기화 된 기록을 갖도록하는 방법에 대한 안내서가 있습니다 .

내장 명령 history을 사용하면 bash에게 파일에서 메모리로 기록을 읽거나 메모리에서 파일로 기록을 읽도록 명시 적으로 지정할 수 있습니다. 예를 들어 : history -r파일의 내용을 읽고 메모리의 기록에 추가합니다. history -w현재 기록을 메모리에서 파일로 쓰고 이전 내용을 덮어 씁니다. 이것은 기본적으로 종료 중에 발생합니다. history명령에 대한 자세한 내용 은bash 매뉴얼

완전성을 위해 다음은 히스토리 동작을 수정하는 내부 변수 목록입니다.

  • HISTFILE: 기록을 읽고 쓸 파일입니다.
  • HISTFILESIZE: 히스토리 파일의 최대 행 수.
  • HISTSIZE: 메모리에서 히스토리의 최대 라인 수.
  • HISTCONTROL, HISTIGNORE, HISTTIMEFORMAT이 논의와 관련이 없습니다. 자세한 내용은 bash 매뉴얼 을 읽으십시오 .

답변

http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively

터미널 중 하나를 사용하여 기록 파일을 쓰는 방법을 조작 할 수 있습니다. 즉, 기록을 저장하려는 터미널에서 “history -a”또는 “history -w”를 실행 한 다음 “history -r” 다른 터미널. 당신이하고 싶은 일에 달려 있습니다.


답변

AFAIK, bash 명령은 SSH 세션이 종료 된 후에 저장됩니다. 따라서 세션이 비정상적으로 종료되면 (예 : 네트워크 장애로 인해) 명령이 저장되지 않습니다. SSH 세션에 대해 이야기하고 있습니다. 로컬 터미널은 유사한 접근법을 사용할 수 있습니다.

여러 세션을 동시에 열면 한 세션에서 입력 한 명령이 다른 세션에서는 보이지 않습니다. 그러나 세션을 종료하면 다시 열 때 이러한 명령이 표시됩니다.