私が作ったら
svn log | head
10番目の出力行の後にエラーメッセージが表示されます。
svn: Write error: Broken pipe
ここで何が起こっているのでしょうか?私はそれと一緒に使用された他のコマンドを見たことがありませんhead
。 SubversionはUnixフィルタリングパラダイムには適していませんか?
答え1
反対側の端が閉じたパイプに書き込まれると、通常はSIGPIPEシグナルを受けて死にます。ただし、以前のようにシグナルを無視することを選択した場合は、svn
戻ってwrite
英語の翻訳を「Broken Pipeline」に設定してください-1
。標準出力に何かを書き込むことができない場合は、対応するエラーメッセージを表示するように選択します。errno
EPIPE
svn
head
入力に10行を書き込んで終了し、パイプを閉じます。svn
もうパイプには何も書けません。 SIGPIPEが無視されない場合、ほとんどのアプリケーションはデフォルトの動作で自動的にシャットダウンされます。何らかの理由で(おそらく死ぬ前に追加の作業を行う必要があるため)、SIGPIPEを無視することを選択し、svn
パイプのエラー状態を確認してパイプに書き込むことができないと判断します。write
同じエラーが発生します。
bash -c 'trap "" PIPE; while echo foo; do :;done' | head
望むより:
strace -e write seq 10000 | head
(Linuxの場合)SIGPIPEを無視しないときのデフォルトの動作を確認してください。
答え2
これは長い間続いたSubversionの問題です(2007年に最初に報告され、2011年までは修正されませんでした)。 svn開発者がそれを修正しないために長い時間がかかる理由は完全には明確ではありませんが、次のようなすべての血まみれの詳細を読むことができます。この問題は1.7.0で修正されました。、リンクされたバグレポートから。したがって、この動作が実際に問題になる場合は、svnクライアントのバージョン(svn --version
)を確認してアップグレードを検討してください。