假设我有两个程序:程序 1 和程序 2。 我想获取 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 &
这是行不通的。任何线索我该怎么办? 提前谢谢你:)
最佳答案
是的,我们可以使用 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
,p2
将其输出发送到 pipe
,pipe
被反馈到p1
:
$ { echo 1; cat pipe; } | p1 | p2 >pipe
3
5
7
9
11
13
^C
循环将永远持续下去,但我先用 ctrl-C 终止了它。 p1
将其输入递增 1,p2
将其输入递增 1。我们看到的输出来自于p2
的stderr流。
工作原理
{ 回显 1;猫管; }
为 p1
提供输入。它提供一个 1
作为种子值,然后提供从 pipe
接收到的任何内容。
p1
的工作原理如下:
while read a
do
sleep 0.1
echo "$((a+1))"
done
它从输入中读取,等待 0.1 秒,然后将递增的值写入其标准输出。短暂等待的目的是让输出不会在屏幕上滚动得太快。
p2
的工作原理如下:
while read b
do
echo "$((b+1))"
done | tee /dev/stderr
就像 p1
一样,它从标准输入读取并将递增的值写入标准输出。为了让我们可以看到终端上发生了什么,这也会将输出的副本发送到 stderr。
关于linux - 在 Bash 中将一个程序的输出转换为另一个程序的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37504720/