我们说我有两个程序: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 &
它不起作用。任何线索我该怎么办? 提前谢谢你:)
答案 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
将其输出提供给p2
,pipe
将其输出发送到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流。
p1
向1
提供输入。它提供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。