터미널 전체에서 기록을 공유하고 기록 명령이 실행된 시기를 추적하고 싶습니다. 직관적인 접근 방식은 EXTENDED_HISTORY
및 를 모두 사용하는 것 같지만 SHARE_HISTORY
이렇게 하면 셸을 다시 시작한 후 경과된 모든 타임스탬프가 0으로 설정됩니다. 이것이 올바른 접근 방식입니까? 가능합니까?
시나리오 1: EXTENDED_HISTORY
및SHARE_HISTORY
$ history -Dn | sed 's|\\n|\n |g'
0:00 cat << EOF > ~/.zshrc
HISTFILE=~/.zhistory-test
HISTSIZE=100
SAVEHIST=100
setopt EXTENDED_HISTORY
setopt SHARE_HISTORY # the only change compared to below
EOF
0:00 exec zsh
0:00
sleep 1
0:00 exec zsh
시나리오 2: 만EXTENDED_HISTORY
$ history -Dn | sed 's|\\n|\n |g'
0:00 cat << EOF > ~/.zshrc
HISTFILE=~/.zhistory-test
HISTSIZE=100
SAVEHIST=100
setopt EXTENDED_HISTORY
EOF
0:00 exec zsh
0:01
sleep 1
0:00 exec zsh
시나리오 3: INC_APPEND_HISTORY
그리고SHARE_HISTORY
시나리오 1과 동일하지만 SHARE_HISTORY
로 대체하면 INC_APPEND_HISTORY
동일한 효과가 있는 것으로 보입니다.
시스템 메시지
$ zsh --version
zsh 5.4.2 (x86_64-unknown-linux-musl)
$ ldd /usr/bin/zsh
/lib/ld-musl-x86_64.so.1 (0x7f0f8b1d8000)
libcap.so.2 => /lib/libcap.so.2 (0x7f0f8acfa000)
libncursesw.so.6 => /lib/libncursesw.so.6 (0x7f0f8aa89000)
libc.so => /lib/ld-musl-x86_64.so.1 (0x7f0f8b1d8000)
$ uname -a
Linux hostname 4.12.13_1 #1 SMP PREEMPT Thu Sep 14 13:15:00 UTC 2017 x86_64 GNU/Linux
$ lsb_release -d
Description: Void Linux
답변1
여러 터미널 세션 간에 확장된 기록을 공유하는 여러 가지 방법을 테스트했는데 이것이 완벽하게 작동하는 유일한 방법입니다.
autoload -Uz add-zsh-hook
setopt extendedhistory incappendhistorytime
load-shared-history() {
# Pop the current history off the history stack, so we don't grow
# the history stack endlessly
fc -P
# Load a new history from $HISTFILE and push it onto the history
# stack.
fc -p $HISTFILE
}
# Import the latest history at the start of each new command line.
add-zsh-hook precmd load-shared-history
이제 터미널 세션에서 기록을 동기화하기 위해 해야 할 일은 Enter 키를 누르는 것뿐입니다.
답변2
당신에게 필요한 유일한 옵션은SHARE_HISTORY
이것은 문서입니다연결됨+ 인용문
이 옵션은 기록 파일에서 새 명령을 가져오거나 사용자가 입력한 명령을 기록 파일에 추가할 수 있습니다(후자는 INC_APPEND_HISTORY를 지정하는 것과 같으며 이 옵션이 적용되는 경우 꺼져야 합니다). 히스토리 라인에는 EXTENDED_HISTORY 출력과 같은 타임스탬프도 함께 제공됩니다(이렇게 하면 파일을 다시 작성한 후 읽기를 중지한 위치를 더 쉽게 찾을 수 있습니다).
기본적으로 기록 이동 명령은 가져온 행과 로컬 행에 액세스하지만 set-local-history zle 바인딩을 사용하여 이 기능을 켜거나 끌 수 있습니다. 일부 명령은 가져온 명령을 무시하고 다른 명령은 이를 포함하도록 zle 위젯을 생성하는 것도 가능합니다.
명령을 가져올 때 더 많은 제어가 필요하다고 생각되면 SHARE_HISTORY를 끄고 INC_APPEND_HISTORY 또는 INC_APPEND_HISTORY_TIME(위 참조)을 켠 다음 필요할 때 "fc -RI"를 사용하여 수동으로 명령을 가져올 수 있습니다.