Я запускаю Ubuntu 14.04.3, это актуально. Я не знаю, почему, в течение нескольких дней я начал брать grep: write error: Broken pipe
сообщение при запуске терминала гнома. Это, кажется, безопасно, но это беспокоит меня. Как я могу отладить его?
Править: Я переместил псевдонимы и функции каждый для разделения файлов такой как .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:
Я нашел подобную проблему здесь клевавшим каналом
Корень проблемы также кажется подобным.
Я попробовал данную тестовую команду в ссылке, которые имеют ту же ошибку:
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
обходное решение, которое я отправил ниже как ответ на мой собственный вопрос, работает, я не удовлетворен им, но мое знание об отладке ограничено. Acoording к этой ссылке, https://lists.gnu.org/archive/html/bug-coreutils/2007-11/msg00080.html, который это останавливает от прерывания SIGPIPE другой задачей и этой ссылки https://lists.gnu.org/archive/html/bug-coreutils/2007-11/msg00154.html, точно определяет точную причину проблемы, это - один из pam модуля аутентификации, который я недавно в беде с ним.
После часов борьбы с проблемой я нашел рабочее обходное решение (Я надеюсь, что так)
, проблема, кажется, глубже и сложна. Многие люди встретили ту же ошибку. Фиксация его вне моего покрытия.
Самое Близкое обходное решение, отправленное здесь how-can-i-fix-a-broken-pipe-error Andrew Beals в основе как:
ls -lt $PWD|dd obs=1M | grep -m 1 ^d | cut -b 51-
не аккуратно.
, Когда я постиг интуитивно это, это связано для передачи по каналу буфера, как который я дал выстрел unbuffer
команда:
unbuffer ls -lt $PWD| grep -m 1 ^d | cut -b 51-
Это работает хорошо.
я надеюсь, что кто-то отправляет реальную причину проблемы.
РЕДАКТИРОВАНИЕ: Гуру удара предложил бы это простое решение, перенаправив stderr к /dev/null
ls -lt $PWD 2>/dev/null | grep -m 1 ^d | cut -b 51-
Существует большое объяснение этой проблемы на этом ответе Суперпользователя: Как я могу зафиксировать Поврежденную ошибку Канала?.
Команды в каналах выполняются асинхронно: это означает это в канале такой как 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