web-dev-qa-db-ja.com

gnome-terminalは「grep:write error:Broken pipe」メッセージで始まります

Ubuntu 14.04.3を実行していますが、最新です。数日の間、起動時にgrep: write error: Broken pipeメッセージを受け取り始めましたgnome-terminal。無害なようですが、それは私を悩ます。どうすればデバッグできますか?

編集:エイリアスと関数をそれぞれ.bash_aliases.bash_functionsなどの個別のファイルに移動し、.bashrcからそれらをロードするコマンドを追加しました

 if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
 fi

 if [ -f ~/.bash_functions ]; then
. ~/.bash_functions
 fi

.bash_functionsをロードしないと、問題はなくなります。

各機能を1つずつ無効にして、障害のあるものを見つけようとしています。

これは私に同じエラーを与えますが、それを無効にすると同じエラーが表示され続けるので、より多くの欠陥のある機能があるかもしれません。

 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という回避策は、私自身の質問に対する答えとして以下に掲載していますが、満足していませんが、デバッグに関する知識は限られています。このリンクに合わせて 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認証モジュールの1つです最近それで。

3
kenn

問題に何時間も苦労した後、回避策を見つけました(そうすることを望みます)

問題はより深く複雑なようです。多くの人が同じバグに遭遇しました。それを修正することは私の範囲を超えています。

ここに掲載されている最も近い回避策 how-can-i-fix-a-broken-pipe-error アンドリュー・ビールズ

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-

うまくいきます。

誰かが問題の本当の原因を投稿することを願っています。

編集:bashの達人はこの単純な解決策を提案し、stderrを/dev/nullにリダイレクトします

 ls -lt $PWD 2>/dev/null | grep -m 1 ^d | cut -b 51-
3
kenn

このスーパーユーザーの回答には、この問題に関する優れた説明があります: ブロークンパイプエラーを修正するにはどうすればよいですか?

パイプ内のコマンドは非同期に実行されます。つまり、command1 | command2などのパイプでは、command1command2の前に終了するという保証はありません。

[...] | grep | head -n 1を使用する場合、headは1行を読み込むとすぐに終了します。 grepがパイプへの書き込みを完了する前にこれが発生した場合、grepはSIGPIPEシグナルを受信して​​エラーを出します。

以下のスーパーユーザーの回答で説明されているように、回避策はパイプラインのheadの前の出力を最初にtail -n +1にパイプすることで、SIGPIPEシグナルは無視されます。

command | tail -n +1 | head -n 1

ただし、この場合、headには最初の一致のみを印刷するオプションがあるため、grepは必要ありません。

[...] | grep -m 1
2
kos