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つです最近それで。
問題に何時間も苦労した後、回避策を見つけました(そうすることを望みます)
問題はより深く複雑なようです。多くの人が同じバグに遭遇しました。それを修正することは私の範囲を超えています。
ここに掲載されている最も近い回避策 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-
このスーパーユーザーの回答には、この問題に関する優れた説明があります: ブロークンパイプエラーを修正するにはどうすればよいですか? 。
パイプ内のコマンドは非同期に実行されます。つまり、command1 | command2
などのパイプでは、command1
がcommand2
の前に終了するという保証はありません。
[...] | 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