여러 터미널 창을 사용할 때 명령 줄 기록은 어떻게 저장됩니까? 나는 그것이 저장된다는 것을 알고 .bash_history
있지만 새 창을 열면 어떤 기록이 사용되는지에 대한 논리를 볼 수 없습니다. 새 창에서 위쪽 화살표를 사용하려고하면 어떤 명령을 볼지 알 수 없다는 의미에서 비 결정적이라고 생각합니다.
누군가 이것을 설명 할 수 있습니까?
특정 창에서 히스토리를 재사용 할 수있는 방식으로 히스토리를 제어하는 방법이 있습니까?
답변
bash 기록의 동작을 이해하려면 먼저 다음을 알아야합니다.
- 히스토리 파일에 히스토리가 있습니다.
- bash 프로세스의 메모리에 히스토리가 있습니다.
- 한 bash 프로세스의 메모리 히스토리는 다른 bash 프로세스의 메모리 히스토리와 동기화되지 않습니다.
- bash 프로세스 메모리의 히스토리는 특정 이벤트에 대해 명시 적으로 요청되거나 특정 이벤트가 발생하지 않는 한 파일의 히스토리와 동기화되지 않습니다 (아래 참조).
기본 설정을 사용하면 히스토리와 관련된 bash 세션의 수명주기는 다음과 같습니다.
- 시작하는 동안 bash는 기록 파일을 읽습니다. 히스토리 파일의 컨텐츠는 이제 bash 프로세스의 메모리에 있습니다.
- 정상적인 사용 중에는 메모리의 기록 만 조작됩니다.
- 종료하는 동안 메모리의 기록이 기록 파일에 기록되고 기록 파일의 이전 내용을 덮어 씁니다.
당신이 관찰 한 겉보기 비결정론 적 행동은 대부분 히스토리 파일의 내용이 항상 마지막 닫힌 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 세션에 대해 이야기하고 있습니다. 로컬 터미널은 유사한 접근법을 사용할 수 있습니다.
여러 세션을 동시에 열면 한 세션에서 입력 한 명령이 다른 세션에서는 보이지 않습니다. 그러나 세션을 종료하면 다시 열 때 이러한 명령이 표시됩니다.