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