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

标签 linux bash input output

假设我有两个程序:程序 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/

相关文章:

php - 使用 PHP 进行认证的随机数生成器

r - 在 WSL 上安装 R devtools 包

linux - : Cannot determine the module for class SomeComponent in/path to that component. ts 中的错误!将 SomeComponent 添加到 NgModule 以修复它

linux - 从文件中删除匹配词

javascript - 如何显示在密码输入类型中输入的文本,否则隐藏密码

c++ - 似乎无法精确排列小数

linux - 检查用户是否属于 sudo 组的脚本

linux - 使用 expr 实用程序在 Linux 中进行浮点运算

linux - 将文件夹中的所有图像合并为视频

javascript - 使用 jquery 查找文本输入是否包含特定文本