Equivalente a bash -x para zsh

Equivalente a bash -x para zsh

Existe uma maneira de fazer com que o comando que acabei de inserir ecoe na tela após entrar?

Ex:

$ echo hello
+ echo hello
hello

Eu sei que isso pode ser feito, bash -xmas não consegui encontrar o equivalente no manual do zsh.

Responder1

A opção -x(ou -o xtrace) também funciona zsh. Isso vem do shell Bourne no final dos anos 70 e é suportado por todos os shells do tipo Bourne. De 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).

Exemplo:

#!/bin/zsh -x

echo hello

e um exemplo de execução:

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

Como em bash/ ksh, pode ser habilitado com set -xou set -o xtracee desabilitado posteriormente com set +xou set +o xtrace. Também é possível ativar o rastreamento por função com functions -t myfunction.

Esteja ciente de que em shells interativos, se você tiver habilitado vários plug-ins sofisticados ou preenchimento avançado, também verá o rastreamento correspondente à execução daqueles que podem afetar sua experiência de shell interativo.

Responder2

Adendo à resposta correta de Andy Dalton, em relação ao comentário de Will…

Eu tentei, mas fez com que meu terminal gerasse um monte de coisas aleatórias, então presumi que não estava certo.

Para zsh, add-zsh-hook -d precmd update_terminal_cwdpode ser usado para reduzir XTRACEa desordem de rastreamento no aplicativo Terminal da Apple.

DR

No caso do aplicativo Terminal da Apple, há um acréscimo que update_terminal_cwd()é executado a cada atualização imediata.

A update_terminal_cwdchamada também é mostrada e adiciona confusão ao '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_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}"

Solução alternativa para Bash: unset PROMPT_COMMANDou modifique PROMPT_COMMANDpara não usar 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

A solução alternativa do Zsh pode ser feita com uma -dexclusão do precmdzsh-hook:

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

informação relacionada