
端末全体で履歴を共有し、履歴コマンドが実行された時期を追跡したいと思います。直感的なアプローチはとをEXTENDED_HISTORY
使用しているようですが、これSHARE_HISTORY
はシェルを再起動してから経過したすべてのタイムスタンプをゼロに設定します。これは正しいアプローチですか?可能ですか?
シナリオ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」を使用して手動でコマンドをインポートできます。