Äquivalent zu bash -x für zsh

Äquivalent zu bash -x für zsh

Gibt es eine Möglichkeit, den gerade eingegebenen Befehl nach der Eingabe auf dem Bildschirm anzuzeigen?

Ex:

$ echo hello
+ echo hello
hello

Ich weiß, dass dies möglich ist, bash -xkonnte im Zsh-Handbuch jedoch nichts Entsprechendes finden.

Antwort1

Die Option -x(oder -o xtrace) funktioniert zshauch. Sie stammt aus der Bourne-Shell aus den späten 70ern und wird von allen Bourne-ähnlichen Shells unterstützt. Von 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).

Beispiel:

#!/bin/zsh -x

echo hello

und ein Beispiellauf:

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

Wie in bash/ kshkann es mit set -xoder aktiviert set -o xtraceund anschließend mit set +xoder deaktiviert werden set +o xtrace. Es ist auch möglich, die Ablaufverfolgung für einzelne Funktionen mit zu aktivieren functions -t myfunction.

Beachten Sie, dass Sie in interaktiven Shells, wenn Sie eine Reihe ausgefallener Plug-Ins oder erweiterte Vervollständigungen aktiviert haben, auch die entsprechende Ablaufverfolgung für die Ausführung dieser Plug-Ins sehen, die sich auf Ihre interaktive Shell-Erfahrung auswirken kann.

Antwort2

Nachtrag zur richtigen Antwort von Andy Dalton, relativ zum Kommentar von Will …

Ich habe es versucht, aber es führte dazu, dass mein Terminal eine Menge zufälliges Zeug ausgab, also nahm ich an, dass es nicht richtig war.

add-zsh-hook -d precmd update_terminal_cwdKann für zsh verwendet werden, um die Trace- XTRACEÜberlastung in der Terminal-App von Apple zu reduzieren.

Kurz zusammengefasst

Bei Apples Terminal-App gibt es zusätzlich einen Zusatz, der update_terminal_cwd()bei jedem Update sofort ausgeführt wird.

Der update_terminal_cwdAufruf wird auch im „set -x“ angezeigt und trägt zu einer Unordnung bei 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_Terminal

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-Workaround: unset PROMPT_COMMANDoder ändern Sie es PROMPT_COMMAND, um es nicht zu verwenden update_terminal_cwd.

/etc/zhrc_Apple_Terminal

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

-dDer Zsh-Workaround kann durch Löschen aus dem precmdZsh-Hook erfolgen :

### `-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 )

verwandte Informationen