gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:42 27 4
gpt4 key购买 nike

假设我有两个程序:程序 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 运行它们,将其输出馈送到 p2p2 将其输出发送到 pipepipe 被反馈到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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com