Say I have a command foo
which takes a filename argument: foo myfile.txt
. Annoyingly, foo
doesn't read from standard input. Instead of an actual file, I'd like to pass it the result of another command (in reality, pv
, which will cat the file and output a progress meter as a side effect).
Is there a way to make this happen? Nothing in my bag of tricks seems to do it.
(foo
in this case is a PHP script which I believe processes the file sequentially).
I'm using Ubuntu and Bash
EDIT Sorry for the slightly unclear problem description, but here's the answer that does what I want:
pv longfile.txt | foo /dev/stdin
Very obvious now that I see it.
If I understand what you want to do properly, you can do it with bash's command substitution feature:
This does something similar to what the
mkfifo
-based answers suggest, except that bash handles the details for you (and it winds up passing something like /dev/fd/63 to the command, rather than a regular named pipe). You might also be able to do it even more directly like this:This Unix SE question has a an answer that shows how to create a temporary named pipe:
Shell Script mktemp, what's the best method to create temporary named pipe?
Based on the answers there, you could do something like the following:
You could then watch the pipe with:
Then delete it when you're done with it.
Try using mkfifo.
In another shell, run foo file_read_by_foo
xargs
seems to work well for this: