读stdin就像它来自使用Bash的文件一样?

时间:2019-09-06 15:36:05

标签: linux bash shell

假设我有一个脚本:

foo.sh

希望打开两个文件:

./foo.sh biz baz

在这种情况下,我已经预先计算了文件,并希望从管道传递给foo.sh,就好像它是一个文件(就像我对ac可执行文件所做的那样) ):

# in pseudo code
./bar.sh initial_baz | ./foo.sh biz - 

我尝试过的解决方案:

./bar.sh initial_baz ...
| ./foo.sh biz -
| ./foo.sh biz /dev/stdin
| ./foo.sh biz </dev/stdin
| ./foo.sh biz <$(/dev/stdin)
| ./foo.sh biz $(/dev/stdin)
./foo.sh biz $(./bar.sh initial_baz)
./foo.sh biz <$(./bar.sh initial_baz)
./foo.sh biz `./bar.sh initial_baz`

etc.

必须有一种方法可以将stdin视为文件...?

1 个答案:

答案 0 :(得分:2)

这应该有效:

./bar.sh initial_baz | ./foo.sh biz /dev/stdin

您也可以使用process substitution

./foo.sh biz <(./bar.sh initial_baz)

在某些情况下,管道不起作用(进程替换在内部使用管道):如果foo.sh试图多次打开文件,或者需要在文件中查找。管道是FIFO队列,您不能多次查找或读取它。