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