【发布时间】:2013-03-22 20:12:15
【问题描述】:
我刚刚发现使用>() 进行进程替换,对此非常兴奋,但是当我尝试它时,它并不总是有效。例如
这行得通:
cat /usr/share/dict/words |tee >(tail -1) > /dev/null
ZZZ
这会导致管道损坏:
cat /usr/share/dict/words |tee >(head -1) > /dev/null
1080
tee: /dev/fd/63: Broken pipe
知道为什么吗? 谢谢!
更新:这是在 RHEL 4 和 RHEL 6.2 上
【问题讨论】:
-
FWIW,这两个都对我有用,没有错误(经过测试的 OS X 和类似 Fedora 的 Linux 发行版)。
-
尝试将
-i传递给tee:cat /usr/share/dict/words | tee -i >(tail -1) >/dev/null -
与 -i 相同:cat /usr/share/dict/words |tee -i >(head -1) > /dev/null 1080 tee: /dev/fd/63: Broken pipe
-
在我的 OS X 上,“head”命令确实发生了
SIGPIPE错误。可能在 tee 完成写入/dev/null之前关闭文件。但这并不能解释为什么 tail 不会产生错误。 -
@user779 这是有道理的,但我仍然认为问题在于
head的提前退出——或者更一般地说,事实上,如果任何输出进程管道在没有消耗整个输入的情况下退出,这将导致tee中的写入错误。您可以尝试改用>(head -1; dd of=/dev/null),以在head退出后使用剩余的输入。