терминал гнома запускается с “grep: ошибка при записи: Поврежденный канал” сообщение

Я запускаю 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 модуля аутентификации, который я недавно в беде с ним.

3
задан 16 February 2016 в 17:25

2 ответа

После часов борьбы с проблемой я нашел рабочее обходное решение (Я надеюсь, что так)

, проблема, кажется, глубже и сложна. Многие люди встретили ту же ошибку. Фиксация его вне моего покрытия.

Самое Близкое обходное решение, отправленное здесь 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-
3
ответ дан 1 December 2019 в 15:36

Существует большое объяснение этой проблемы на этом ответе Суперпользователя: Как я могу зафиксировать Поврежденную ошибку Канала?.

Команды в каналах выполняются асинхронно: это означает это в канале такой как 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
2
ответ дан 1 December 2019 в 15:36

Другие вопросы по тегам:

Похожие вопросы: