“pipe quebrado” após cada comando do terminal

1

Estou executando o Mac OS X 10.10 (Yosemite) com iTerm2 e Oh -My-Zsh . Depois de cada comando que eu executo - mesmo se o comando for bem-sucedido - eu recebo o erro “cano quebrado”. Como posso solucionar o que está gerando esse erro para que eu possa corrigi-lo?

    
por Cody C 19.11.2014 / 15:57

1 resposta

1

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% 
    
por 20.11.2014 / 08:09