【问题标题】:Broken pipe in tee with process substituion三通中的断管与工艺替换
【发布时间】: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 传递给teecat /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 退出后使用剩余的输入。

标签: bash shell


【解决方案1】:

这里解释了为什么你会得到头部错误而不是尾部错误:

head -1 只需读取其输入的一行。然后它将退出,并且 tee 继续将其输出输入...

另一方面,tail -1 必须读取完整的输入才能完成其工作,因此它永远不会在 tee 完成之前终止管道。

您可以放心地忽略损坏的管道消息,并且许多程序会停止报告此类错误。在我的机器上我看不到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多