모든 쉘 간에 단일 명령 기록을 공유할 수 있습니까?
기본적으로 먼저 종료된 셸이 기록을 덮어쓰는 것 같습니다. 각 쉘에 "이름"과 자체 히스토리 파일이 있는 경우 이전에 이 작업을 수행한 적이 있지만 이제 쉘 사용이 더 가벼워지므로 과도한 느낌이 듭니다.
고쳐 쓰다
incapendhistory를 활성화하지 않은 것 같습니다.
> setopt | grep inc
달리면 setopt incappendhistory
이 문제가 해결됩니다. 그러다가 히스토리 파일을 보면 바로 파일이 첨부된 것을 알 수 있습니다.
그러나 이 기록은 새 셸을 연 후에만 다른 셸에서 사용할 수 있는 것 같습니다(이것이 제가 원하는 동작일 수 있습니다). 다른 쉘의 명령을 사용하여 수행한 설정은 즉시 sharedhistory
사용할 수 있습니다. setopt
나는 실제로 그것이 내가 추구하는 것이라고 생각하지 않습니다. 왜냐하면 다른 껍질에 다른 역사를 갖는 것이 유용하기 때문입니다. 난 그냥하고 싶지 않아잃다역사.
답변1
첫째, 기본적으로 zsh는 명령 기록을 저장하지 않습니다. HISTFILE
히스토리를 저장할 파일의 경로와 SAVEHIST
저장할 라인 수를 설정해야 합니다 . 바라보다Zsh의 명령 기록. 이 답변의 나머지 부분에서는 기록이 저장되고 있다고 가정하고 기록을 저장하고 로드할 시기를 논의하겠습니다.
기본적으로 zsh는 시작 시 기록을 로드하고 종료 시 기록을 저장합니다. 기록을 저장할 때 현재 세션의 기록을 기록 파일에 추가합니다. 따라서 동시 세션이 있더라도 기록이 손실되지 않습니다(기록 파일이 1.2x $SAVEHIST
행에 도달할 때까지 zsh가 파일을 정리합니다). 이 접근 방식의 가장 큰 장점은 세션 내의 행이 여전히 그룹화되어 있다는 것입니다. 단점은 세션 A의 행이 세션 A가 종료된 후에 시작된 세션에만 표시된다는 것입니다. 또 다른 단점은 컴퓨터(또는 zsh)가 충돌하면 기록이 손실된다는 것입니다(그러나 SSH 연결을 끊는 네트워크 문제로 인해 터미널이 단순히 사라지면 기록이 저장됩니다).
열면share_history
옵션을 선택하면 zsh는 각 기록 행을 입력하자마자 저장하고 새 기록 행이 사용 가능해지면 즉시 로드합니다. (또는 더 정확하게는 새 프롬프트가 표시되기 전에 명령줄을 편집할 때 zsh는 기록을 읽지 않습니다.) 가장 큰 장점은 모든 세션에서 기록 줄을 즉시 사용할 수 있다는 것입니다. 가장 큰 단점은 서로 다른 세션의 행이 함께 혼합되어 기록의 연속 행이 서로 이해되지 않을 수 있다는 것입니다.
옵션이 있습니다inc_append_history
그리고inc_append_history_time
. zsh는 각 명령이 실행될 때 즉시 기록을 저장하지만 자동으로 새 기록 행을 읽지는 않습니다(물론 시작 시 제외). 이 _time
변형은 이전 대신 명령을 실행한 후에 기록을 저장하므로 zsh가 실행 시간을 절약할 수 있습니다.
닫아도 돼append_history
옵션을 사용하면 zsh는 기록 파일을 추가하는 대신 저장할 때 기록 파일을 덮어씁니다. 따라서 세션 A를 시작한 다음 세션 B를 시작한 다음 A를 종료하고 B를 종료하면 A의 기록이 손실됩니다. 나는 이 동작을 선택해야 할 타당한 이유를 생각할 수 없습니다(그러나 이는 bash의 기본 동작입니다).
다음을 실행하여 언제든지 기록 파일에 새 줄을 가져올 수 있습니다.fc -RI
. 이는 share_history
때때로 다른 세션에서 기록을 명시적으로 가져오는 기능을 사용하지 않는 경우 유용할 수 있습니다.
다음을 실행하여 언제든지 새 줄을 기록에 저장할 수 있습니다.fc -AI
. 이는 현재 세션의 기록을 명시적으로 내보내는 데 사용하지 않거나 때때로 오는 경우에 inc_append_history
유용 share_history
합니다.
이 답변에서 설명하는 기본값은 zsh 기본값입니다. 일부 배포판과 대부분의 zsh 구성 프레임워크는 최소한 기본적으로 기록을 활성화하고 일부 기록 관련 옵션을 변경할 수 있습니다.