将pipe道传递给需要文件名的命令

说我有一个命令foo它采用文件名参数: foo myfile.txt 。 烦人的是, foo不会从标准input中读取。 而不是一个实际的文件,我想通过它的另一个命令的结果(实际上, pv ,这将捕获文件和输出一个进度计作为副作用)。

有没有办法做到这一点? 我的伎俩似乎没有任何东西可以做到。

(在这种情况下, foo是一个PHP脚本,我相信这个脚本是按顺序处理的)。

我正在使用Ubuntu和Bash

编辑对不起,有点不清楚的问题描述,但这是我想要的答案:

 pv longfile.txt | foo /dev/stdin 

非常明显,现在我明白了。

如果我明白你想要做什么,你可以用bash的命令replacefunction来做:

 foo <(somecommand | pv) 

这个和基于mkfifo的答案相似,除了bash处理你的细节(并且把/ dev / fd / 63传递给命令,而不是一个普通的命名pipe道)。 你可能也可以直接这样做:

 somecommand | pv | foo /dev/stdin 

这个Unix SE问题有一个答案,显示了如何创build一个临时的命名pipe道:

Shell脚本mktemp,创build临时命名pipe道的最佳方法是什么?

根据那里的答案,你可以做如下的事情:

 tmppipe=$(mktemp -u) mkfifo -m 600 "$tmppipe" pv examplefile > $tmppipe 

然后你可以看pipe道:

 foo $tmppipe 

然后在完成后删除它。

 ARRAY=(`pv whatever`); for FILE in $ARRAY; do foo $FILE; done 

尝试使用mkfifo。

 mkfifo file_read_by_foo; pv ... > file_read_by_foo 

在另一个shell中,运行foo file_read_by_foo

xargs似乎为此工作得很好:

 echo longfile.txt | xargs pv