여러 세션을 실행할 때 이상한 bash 기록 동작


15

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

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

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

답변:


14

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 매뉴얼 을 읽으십시오 .

좋은 설명입니다. 셧다운에 대해 언급했지만 터미널 세션 종료는 어떻습니까? 세션은 로그 아웃 또는 UI 또는 네트워크 연결 끊기와 같은 다른 방법을 통해 종료 될 수 있습니다. 전체 기록 파일이 교체되고 여러 세션이있는 경우 마지막 닫은 기록이 기록 파일에 사용된다고 말합니까? 비 결정적 행동을 설명 할 수 있습니다.
Alex Gitelman

수명주기 지점 (3)이 올바르지 않습니다. 첫 번째 bash 세션 만 기록 파일에 쓰는 것처럼 보입니다. 테스트 : 2 개의 세션을 순서대로 엽니 다 (a, b). b 에서 'echo hello'를 수행하십시오 . 그런 다음 b 에서 나갑니다 . 그런 다음 새 세션을 엽니 다 c . 이 세션에는 기록에 에코 안녕하세요가 없습니다.
user606723

@AlexGitelman : bash 프로세스가 종료되면 히스토리 파일을 덮어 쓸 수 없습니다. 그렇습니다. 마지막으로 닫힌 세션의 기록은 기록 파일에있는 기록입니다.
lesmana

@ user606723 : 포인트 3이 맞습니다. bash 매뉴얼을 읽으십시오. 최소 .bashrc파일을 사용하여 다시 실험하십시오 . 배포판에서의 일부 설정이 변경되었을 수 있습니다 /etc/bash.bashrc. 쉘 옵션을 구체적으로 확인하십시오 histappend.
lesmana


0

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

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


이것은 내가 경험 한 행동이 아닙니다. ssh 세션을 열고 명령을 수행하고 정상적으로 종료하는 빠른 테스트를 수행하여이를 확인할 수 있습니다. 이 경우 이전에 활성화 된 다른 ssh 세션이있었습니다. 이 기존 bash 세션에서 .bash_history를 확인하고 아무것도 기록하지 않았습니다. 첫 번째 bash 세션이 .bash_history에 기록되는 유일한 세션 일 가능성이 있습니다.
user606723

세션을 종료해도 현재 실행중인 세션에는 영향을 미치지 않지만 새 세션에는 영향을줍니다!
Khaled

SSH가 아니라 UI를 통해 닫은 Gnome 터미널 창이 아닌 경우 어떻게합니까?
Alex Gitelman

확인이 필요합니다. 현재 Gnome 터미널에 액세스 할 수 없습니다!
Khaled

@Khaled, 테스트 해봤지만 새 세션에는 영향을 미치지 않습니다. (나는 bash는 새로운 세션의 명령 기록을 얻는 곳이다, 전에 어쨌든 .bash_history 파일 확인, 나는 그래서 같으면 알았 t 작업,하지만 난 당신을 어쨌든 humour'ed.)
user606723
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.