Я запускаю Ubuntu 14.04.3, это uptodate. Я не знаю, почему, в течение нескольких дней, я начал принимать сообщение grep: write error: Broken pipe о запуске gnome-терминала. Это кажется безобидным, но меня это беспокоит. Как я могу его отладить?
EDIT: я переместил псевдонимы и функции каждый для разделения файлов, таких как .bash_aliases и .bash_functions, и добавил команду, чтобы загрузить их из .bashrc
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
if [ -f ~/.bash_functions ]; then
. ~/.bash_functions
fi
Если я не загружаю .bash_functions проблема исчезает.
Я пытаюсь найти неисправный, отключая каждую функцию по одному.
Это дает мне та же ошибка, но когда я отключил ее, я продолжаю получать ту же ошибку, поэтому у меня могут быть более неисправные функции.
ls -lt $PWD| grep ^d | head -1 | cut -b 51-
grep: development
write error: Broken pipe
Интересно, почему я начинаю принимать эту ошибку.
EDIT2:
Я нашел аналогичную проблему здесь boken pipe
Корень проблемы также кажется схожим.
Я попробовал данную тестовую команду в ссылке, которая имеет ту же ошибку:
bash -c '(while echo foo; do :; done); echo status=$? >&2' | head
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
bash: line 0: echo: write error: Broken pipe
status=0
EDIT3:
Хотя это unbuffer обходное решение я разместил ниже поскольку ответ на мой собственный вопрос работает, я не удовлетворен этим, но мои знания об отладке ограничены. В соответствии с этой ссылкой boken pipe он проистекает из ловушки SIGPIPE другой задачей, и эта ссылка https://lists.gnu.org/archive/html/bug-coreutils/2007-11/msg00154.html точно определяет причину проблемы, это один из модулей проверки подлинности pam, с которыми я недавно столкнулся с проблемой.
В этом ответе суперпользователя есть большое объяснение этой проблемы: как я могу исправить ошибку Broken Pipe?. [! d0]
Команды в трубах выполняются асинхронно: это означает, что в канале, таком как command1 | command2 нет гарантии, что command1 закончится до command2.
При использовании [...] | grep | head -n 1, head заканчивается, как только он читает одну строку; если это произойдет до того, как grep закончит запись в трубу, grep получит сигнал SIGPIPE и ошибки.
Как объясняется в ответе ниже, что ответ Суперпользователя, обходным путем является выход на выход из того, что было раньше head в конвейере до tail -n +1, которое игнорирует сигнал SIGPIPE:
command | tail -n +1 | head -n 1
Но в этом случае нет необходимости в head, так как grep имеет возможность распечатывать только первое совпадение:
[...] | grep -m 1