如何将仅适用于输入/输出文件的程序包含到管道中?

如何将仅适用于输入/输出文件的程序包含到管道中?

我需要使用管道中的多个工具处理图像tool1 | tool2 | tool3 | ...。但其中一个工具似乎并非设计用于在管道中工作,而只能以user@computer:/~# bad_tool infile.png outfile.png.

有什么方法可以将其纳入管道吗?我真的想避免为这个唯一的程序创建文件,然后删除它们,等等。

答案1

如果管道通常是:

tool1 | tool2 | tool3

但是工具2是“坏的”,它需要2个参数(第一个是输入文件,第二个是输出文件),你可以像这样重写它:

tool2 <(tool1) >(tool3)

当然,如果你的shell支持流程替代

答案2

如果这令您满意,这里是如何使用管道来做到这一点的建议。

假设“badtool”的输入和输出文件可以是管道。

mkfifo IF
mkfifo OF

# one therminal
tool | tool2 |... tooln > IF

# second terminal
bad_tool IF OF

#third terminal
tooln+1 < OF | tool n+2 | tool n+3 ...

如果您想创建脚本,您可以将这些部分包装到函数中:

function A(){ ... }
function B(){ ... }
function C(){ ... }
# and run in background in parallel
A&
B&
C&

继续处理所有图像(管道IFOF“可重复使用”),并在整个工作完成后删除它们

rm IF OF

答案3

如果这是linux,你可以这样做

bad_tool /dev/stdin /dev/stdout

/dev/stdin/dev/stdout只是/proc/self/fd/{0,1}(分别)的符号链接。

相关内容