在Bash中将一个程序的输出转换为另一个程序的输入

时间:2016-05-28 23:32:18

标签: linux bash input output

我们说我有两个程序:program1和program2。 我想取得program1的输出,把它放到program2的输入中,然后输出program2并把它放到program1等的输入中。

bash脚本应如何做到这一点? 我已经阅读了很多关于管道和输入/输出重定向的内容,但我还是不确定。是否可以将一个管道用于program2的输入和输出,另一个用于program2?

我写过这样的话:

PIPE=$(mktemp -u)
mkfifo $PIPE
exec 3<>$PIPE
rm $PIPE 
cat <&3 >&3 &

但是当我想像这样运行program1和program2时:

cat <&3 | ./program1 >&3 &
cat <&3 | ./program2 >&3 &

它不起作用。任何线索我该怎么办? 提前谢谢你:)

1 个答案:

答案 0 :(得分:2)

是的,我们可以使用FIFO将流水线的输出循环回其输入。这是怎么回事。

首先,让我们创建一个fifo(名为pipe):

$ mkfifo pipe

为了演示目的,还要创建在管道中使用的shell函数:

$ p1() { while read a; do sleep 0.1; echo "$((a+1))"; done; }
$ p2() { while read b; do echo "$((b+1))"; done | tee /dev/stderr; }

现在,让我们运行它们,p1将其输出提供给p2pipe将其输出发送到p1,然后反馈到$ { echo 1; cat pipe; } | p1 | p2 >pipe 3 5 7 9 11 13 ^C 的输入:

p1

循环会永远继续,但我先用ctrl-C终止它。 p2将其输入增加1,p2将其输入增加1。我们看到的输出来自{ echo 1; cat pipe; }的stderr流。

如何运作

p11提供输入。它提供pipe作为种子值,然后提供从p1收到的任何内容。

while read a do sleep 0.1 echo "$((a+1))" done 的工作原理如下:

p2

它从输入读取,等待0.1秒,并将增加的值写入其标准输出。短暂等待的目的是使输出在屏幕上不会滚得太快。

while read b do echo "$((b+1))" done | tee /dev/stderr 的工作原理如下:

p1

就像focusGained()一样,它从stdin读取并将增加的值写入stdout。这样我们就可以看到终端上发生了什么,这也会将输出的副本发送给stderr。