1

Я использую Mac OS X 10.10 (Yosemite) с iTerm2 и Oh-My-Zsh. После каждой выполняемой команды - даже если команда выполнена успешно - я получаю сообщение об ошибке «сломанная труба». Как я могу решить, что выводит эту ошибку, чтобы я мог ее исправить?

1 ответ1

1

Обычно, если вы запускаете setopt xtrace в сеансе zsh или запускаете zsh с помощью zsh -x , zsh будет печатать каждую команду и ее аргументы по мере ее выполнения, включая внутренние, используемые для настройки приглашения или других функций подключения.

Это, вероятно, создаст много выходных данных, так как oh-my-zsh может запустить довольно много функций только для отображения приглашения. Это будет выглядеть примерно так:

[...]
+__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='
[...]

Каждая строка имеет префикс PROMPT4 , который по умолчанию равен +%N:%i> . %N обозначает имя скрипта, исходного файла или функции, %i - номер строки. Остальное - команда после ее выполнения, то есть после всех подстановок и расширений.

Например:

+__tempdirs:6> [[ /home/adaephon == (#b)(/tmp/foo/)([^/]##)* ]]

ссылается на 6-ю строку некоторого скрипта или функции с именем __tempdirs . Ища эту строку в моей конфигурации zsh, я нахожу:

        if [[ $2 = (#b)(/tmp/foo/)([^/]##)* ]]; then

В моей конфигурации __tempdirs в элементе zsh_directory_name_functions , который представляет собой список функций, которые zsh использует для динамического именования каталогов. Так как текущий рабочий каталог отображается как часть моего обычного приглашения, он запускается каждый раз перед отображением приглашения.

В вашем случае сообщение об ошибке "сломанная труба" будет находиться непосредственно под строками, где происходит ошибка. Элементы конвейерных команд обычно сначала печатаются построчно, а затем выводятся, но это может быть немного сложнее:

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% 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .