ヘッドを配管すると、Subversionでパイプ破損エラーが発生するのはなぜですか?

ヘッドを配管すると、Subversionでパイプ破損エラーが発生するのはなぜですか?

私が作ったら

svn log | head

10番目の出力行の後にエラーメッセージが表示されます。

svn: Write error: Broken pipe

ここで何が起こっているのでしょうか?私はそれと一緒に使用された他のコマンドを見たことがありませんhead。 SubversionはUnixフィルタリングパラダイムには適していませんか?

答え1

反対側の端が閉じたパイプに書き込まれると、通常はSIGPIPEシグナルを受けて死にます。ただし、以前のようにシグナルを無視することを選択した場合は、svn戻ってwrite英語の翻訳を「Broken Pipeline」に設定してください-1。標準出力に何かを書き込むことができない場合は、対応するエラーメッセージを表示するように選択します。errnoEPIPEsvn

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)を確認してアップグレードを検討してください。

関連情報