为什么 Subversion 在通过管道输入 head 时会出现管道损坏错误?

为什么 Subversion 在通过管道输入 head 时会出现管道损坏错误?

如果我做一个

svn log | head

在第十行输出之后,我收到一条错误消息:

svn: Write error: Broken pipe

这里发生了什么?我还没有看到任何其他命令在与head. Subversion 对 Unix 过滤范例不友好吗?

答案1

当您写入另一端已关闭的管道时,通常会收到 SIGPIPE 信号并死亡。但是,如果您像这样做一样选择忽略该信号svn,则write返回-1errno设置为其EPIPE英文翻译为“Broken pipeline”。并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),并考虑升级...

相关内容