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


19

说我有一个foo接受文件名参数的命令:foo myfile.txt。令人讨厌的是,foo它不会从标准输入中读取内容。我想将另一个命令的结果(而不是实际的文件)传递给它(实际上是,pv它将显示该文件并输出进度表作为副作用)。

有没有办法做到这一点?我的绝招似乎无济于事。

foo在这种情况下,是一个PHP脚本,我相信它会顺序处理该文件)。

我正在使用Ubuntu和Bash

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

pv longfile.txt | foo /dev/stdin

现在很明显,我看到了。


您在寻找单线吗?
Dave Forgac

您确定foo不接受参数“-”以使其从stdin读取吗?
rackandboneman 2012年

可悲的是,在这种情况下-这是一个php脚本。
史蒂夫·贝内特

是的,实际上。。
史蒂夫·贝内特

Answers:


19

如果我了解您要正确执行的操作,则可以使用bash的命令替换功能:

foo <(somecommand | pv)

这与mkfifo基于-b的答案所建议的功能类似,不同之处在于bash为您处理了详细信息(它最终将/ dev / fd / 63之类的内容传递给命令,而不是常规的命名管道)。您也许还可以像这样更直接地做到这一点:

somecommand | pv | foo /dev/stdin

1
哦,真好!这pv inputfile.txt | foo /dev/stdin正是我想要的,但是没有想到。
史蒂夫·本内特

!/ dev / stdin
sage

<(.)为我工作。Bash手册中是否记录了此语法?我了解(.)命令替换已记录在案,但没有看到与<解释的结合。
flow2k

@ flow2k称为“进程替换”-参见bash手册的3.5.6节
戈登·戴维森

得到它了。您是对的,它提到它使用命名管道/ mkfifo
flow2k

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


1

尝试使用mkfifo。

mkfifo file_read_by_foo; pv ... > file_read_by_foo 

在另一个外壳中,运行foo file_read_by_foo


0

xargs 似乎为此工作良好:

echo longfile.txt | xargs pv

这样做的不同之处在于:运行pv多次,每次运行都有一条或多条从绘制的线longfile.txt。根本不是我想要的。
史蒂夫·本内特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.