
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 -x
mas 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 -x
ou set -o xtrace
e desabilitado posteriormente com set +x
ou 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_cwd
pode ser usado para reduzir XTRACE
a 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_cwd
chamada 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_COMMAND
ou modifique PROMPT_COMMAND
para 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 -d
exclusão do precmd
zsh-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 )