如果我做一个
svn log | head
在第十行输出之后,我收到一条错误消息:
svn: Write error: Broken pipe
这里发生了什么?我还没有看到任何其他命令在与head
. Subversion 对 Unix 过滤范例不友好吗?
答案1
当您写入另一端已关闭的管道时,通常会收到 SIGPIPE 信号并死亡。但是,如果您像这样做一样选择忽略该信号svn
,则write
返回-1
并errno
设置为其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
),并考虑升级...