コマンド置換を2回実行せずにzshシェルヘッダを設定するには?

コマンド置換を2回実行せずにzshシェルヘッダを設定するには?

私の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

残念ながら、すべての端末は異なり、唯一の方法は各端末に異なる端末を作成するようですpreexecprecmdtmuxからタスクタブのタイトルを取得するには、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\\"

おすすめ記事