zsh の bash -x と同等

zsh の bash -x と同等

入力したコマンドを入力後に画面に表示させる方法はありますか?

元:

$ echo hello
+ echo hello
hello

これが実行できることはわかっていますbash -xが、zsh マニュアルで同等のものを見つけることができませんでした。

答え1

-x(または-o xtrace) オプションも で動作します。zshこれは 70 年代後半の Bourne シェルから来ており、すべての Bourne 系シェルでサポートされています。/man zshoptionsよりinfo zsh xtrace:

XTRACE (-x, ksh: -x)
    Print commands and their arguments as they are executed.  The
    output is preceded by the value of $PS4, formatted as described
    in the section EXPANSION OF PROMPT SEQUENCES in zshmisc(1).

例:

#!/bin/zsh -x

echo hello

実行例:

$ /tmp/ex.sh
+/tmp/ex.sh:3> echo hello
hello

bash/と同様にkshset -xまたはで有効にし、その後またはset -o xtraceで無効にすることができます。 を使用して関数ごとにトレースを有効にすることもできます。set +xset +o xtracefunctions -t myfunction

対話型シェルでは、多数の高度なプラグインや高度な補完機能を有効にしている場合、対話型シェルのエクスペリエンスに影響を与える可能性のあるプラグインの実行に対応するトレースも表示されることに注意してください。

答え2

Will のコメントに対する Andy Dalton の正解を補足します。

試してみましたが、ターミナルにランダムなものが大量に出力されたので、正しくないと思いました。

zsh の場合、Apple のターミナル アプリでadd-zsh-hook -d precmd update_terminal_cwdトレースの乱雑さを軽減するために使用できます。XTRACE

要約

Apple のターミナル アプリの場合、update_terminal_cwd()プロンプトの更新ごとに実行されるものが追加されます。

このupdate_terminal_cwd呼び出しは 'set -x' にも表示され、混乱を招きますXTRACE

username@hostname ~ % echo hello
# +-zsh:2> echo hello
# hello
# +update_terminal_cwd:5> local url_path=''                                                                                         
# +update_terminal_cwd:10> local i ch hexch LC_CTYPE=C LC_COLLATE=C LC_ALL='' LANG=''
# +update_terminal_cwd:11> i = 1
# 
# … <snip>
# 
# +update_terminal_cwd:22> printf '\e]7;%s\a' #file://hostname.local/Users/username

/etc/bashrc_Apple_ターミナル

update_terminal_cwd() {
# Identify the directory using a "file:" scheme URL, including
# the host name to disambiguate local vs. remote paths.

# … <snip>

printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
}
PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"

Bash の回避策:unset PROMPT_COMMANDまたは、PROMPT_COMMANDを使用しないように変更しますupdate_terminal_cwd

/etc/zhrc_Apple_ターミナル

update_terminal_cwd() {
# Identify the directory using a "file:" scheme URL, including
# the host name to disambiguate local vs. remote paths.

    # Percent-encode the pathname.
    local url_path=''
    {
      # … <snip>
    }

printf '\e]7;%s\a' "file://$HOST$url_path"
}

# Register the function so it is called at each prompt.
autoload -Uz add-zsh-hook
add-zsh-hook precmd update_terminal_cwd

Zsh の回避策は、zsh-hook-dから削除することで実行できます。precmd

### `-L` list
user@host ~ % add-zsh-hook -L
# typeset -g -a zshexit_functions=( shell_session_update )
# typeset -g -a precmd_functions=( update_terminal_cwd )

user@host ~ % add-zsh-hook -d precmd update_terminal_cwd

user@host ~ % add-zsh-hook -L                           
# typeset -g -a zshexit_functions=( shell_session_update )

user@host ~ % set -x
user@host ~ % echo hello
# +-zsh:8> echo hello
# hello

user@host ~ % set +x; add-zsh-hook -L
# typeset -g -a zshexit_functions=( shell_session_update )

関連情報