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

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

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

有什么方法可以实现这一点吗?我的各种方法似乎都行不通。

foo在本例中是一个 PHP 脚本,我相信它会按顺序处理文件)。

我正在使用 Ubuntu 和 Bash

编辑抱歉,问题描述稍微不清楚,但这里的答案符合我的要求:

pv longfile.txt | foo /dev/stdin

现在我看到了,非常明显。

答案1

如果我理解你想要做什么,你可以使用 bash 的命令替换功能来完成:

foo <(somecommand | pv)

这与基于 -based 的答案所建议的操作类似mkfifo,只是 bash 会为您处理详细信息(最终会将 /dev/fd/63 之类的内容传递给命令,而不是常规命名管道)。您也许还可以更直接地执行此操作,如下所示:

somecommand | pv | foo /dev/stdin

答案2

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

答案3

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

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

根据那里的答案,您可以执行以下操作:

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

然后你可以用以下方法观察管道:

foo $tmppipe

用完后再将其删除。

答案4

xargs似乎对此很有效:

echo longfile.txt | xargs pv

相关内容