【发布时间】:2021-02-06 18:23:08
【问题描述】:
我正在处理一个脚本,它首先调用嘈杂的(stdout 和 stderr 上的大量诊断)程序,然后使用其他工具处理其输出。
程序的冗长使得它不可能简单地将其标准输出发送到管道,所以目前我们使用一个临时文件——我想结束这种做法。
我们可以要求程序将数据写入/dev/fd/N,而不是/tmp/foo——它会,没问题(例如,它不需要seek文件)。
它目前发送给stdout和stderr的噪音,可以继续往那里去——操作员见惯了,如果它消失了会报警……
但是如何安排描述符N存在并发送到下一个程序的stdin?
noisy -o /dev/fd/N ?????| filter -i /dev/stdin
如果这需要bash,那就这样吧,但我当然更喜欢适合整个 sh 家族的解决方案。
【问题讨论】:
-
我认为你应该继续使用临时文件。
-
临时文件坏了。它们的效率较低,并且会乱扔文件系统——可靠地清理它们所需的代码比我的问题的任何答案都要丑陋。它们可能会被某人匆忙使用——太忙而不能正确做事。但是像你一样鼓励使用它们比使用它们更错误。
-
好吧,那么祝你好运
-
你能使用命名管道吗,如Example of using named pipes in Linux Bash?
-
一个更有成效的方法可能是编写一个包装器来抑制噪音并只保留有用的输出。如果噪音是可预测的,它可以像单个
grep一样简单。
标签: bash unix sh pipeline file-descriptor