私のzsh設定では、setopt PROMPT_SUBST
.shellコマンドでコマンド置換を使用したときに2回実行されることがわかりました。これにより、スクリプトが遅くなったり、バグが発生したりする可能性があります。
% setopt PROMPT_SUBST
% echo $(echo executed >&2)
executed
executed
.NETでxtermウィンドウのタイトルを設定したため、これが発生したことがわかりましたpreexec()
。 (注:私はxtermを使用していませんが、WSL端末、wslterm、tmuxなどの多くの端末で同じコードが機能します。)コマンド置換を行わないようにヘッダーを設定するにはどうすればよいですか?注:現在のタイトル設定コードは次のとおりです。
preexec () {
print -Pn "\ek$2\e\\"
}
precmd () {
print -Pn "\ekzsh\e\\"
}
答え1
残念ながら、すべての端末は異なり、唯一の方法は各端末に異なる端末を作成するようですpreexec
。precmd
tmuxからタスクタブのタイトルを取得するには、set -g allow-rename on
.tmux.confに追加tmux set -g allow-rename on
するか、コマンドを実行せずにタイトルを設定する関数は次のとおりです。
preexec () {
local cmd=$2
printf "\033k%s\033\\" $cmd
}
precmd () {
printf "\033kzsh\033\\"
}
より包括的なソリューションを得るには、問題ごとに異なるスキルが必要です$TERM
。 tmuxはを使用して検出されません$TERM
。
if [[ -n $TMUX ]]; then
preexec () {
local cmd=$2
printf "\033k%s\033\\" $cmd
}
precmd () {
printf "\033kzsh\033\\"
}
else
# Set xterm/terminal/whatever titles when commands are running:
case $TERM in
linux)
;;
*xterm*|rxvt|rxvt-unicode|rxvt-256color|(dt|k|E)term)
preexec() {
# TODO
}
precmd() {
# TODO
}
;;
*screen*)
preexec() {
# TODO
}
precmd() {
# TODO
}
;;
esac
fi
preexec
すべての端末でテストする価値があるいくつかのコマンドは次のとおりです。
print -Pn "\e]0;${cmd}\a"
print -Pn "\ek${cmd}\e\\"