我需要使用管道中的多个工具处理图像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&
继续处理所有图像(管道IF
和OF
“可重复使用”),并在整个工作完成后删除它们
rm IF OF
答案3
如果这是linux,你可以这样做
bad_tool /dev/stdin /dev/stdout
/dev/stdin
和/dev/stdout
只是/proc/self/fd/{0,1}
(分别)的符号链接。