Geralmente, se você executar setopt xtrace
em uma sessão zsh ou iniciar zsh com zsh -x
, zsh imprimirá cada comando e seus argumentos conforme são executados, incluindo os internos usados para configurar o prompt ou outras funções de gancho.
Isso provavelmente criará muitos resultados, já que o oh-my-zsh pode executar algumas funções apenas para exibir o prompt. Será algo parecido com isto:
[...] +__config.git:9> return 1 +__tempdirs:1> emulate -L zsh +__tempdirs:2> setopt extendedglob +__tempdirs:3> setopt nullglob +__tempdirs:4> local -a match mbegin mend +__tempdirs:5> [[ d == d ]] +__tempdirs:6> [[ /home/adaephon == (#b)(/tmp/foo/)([^/]##)* ]] +__tempdirs:10> return 1 +xtermtitle:5> local 'preamble=pts/32 adaephon@tau: ' +xtermtitle:6> local 'cl=' [...]
Cada linha é prefixada com o valor de PROMPT4
, que por padrão é +%N:%i>
. %N
significa o nome do script, arquivo ou função originada, %i
para o número da linha. O resto é o comando enquanto é executado, ou seja, depois de todas as substituições e expansões.
Por exemplo:
+__tempdirs:6> [[ /home/adaephon == (#b)(/tmp/foo/)([^/]##)* ]]
refere-se à sexta linha de algum script ou função chamada __tempdirs
. Procurando por esta linha na minha configuração zsh eu acho:
if [[ $2 = (#b)(/tmp/foo/)([^/]##)* ]]; then
Na minha configuração __tempdirs
em um elemento do zsh_directory_name_functions
, que é uma lista de funções que o zsh usa para nomear dinamicamente o diretório. Como o presente diretório de trabalho é mostrado como parte do meu prompt normal, ele é executado toda vez que o prompt é exibido.
No seu caso, a mensagem de erro "pipe quebrado" será apenas sob as linhas onde o erro ocorre. Os elementos dos comandos canalizados são geralmente impressos linha por linha, seguidos pela saída, mas podem ficar um pouco complicados:
tau% setopt xtrace tau% echo foo | sed 's/o/u/g' | (sed 's/u/a/g' ; echo bar) | sed 's/a/e/g' +zsh:4> echo foo +zsh:4> sed s/o/u/g +zsh:4> sed s/u/a/g +zsh:4> sed s/a/e/g fuu +zsh:4> echo bar ber tau%