说我有一个命令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