如何将 A 的标准输出重定向到 B 的标准输入,将 B 的标准输出重定向到 A 的标准输入?

Posted

技术标签:

【中文标题】如何将 A 的标准输出重定向到 B 的标准输入,将 B 的标准输出重定向到 A 的标准输入?【英文标题】:How to redirect A's stdout to B's stdin and B's stdout to A's stdin? 【发布时间】:2019-05-26 01:55:45 【问题描述】:

现在我有程序 A 和 B。我想使用 bash 将 A 的标准输出重定向到 B 的标准输入,并将 B 的标准输出重定向到 A 的标准输入。

我看到有人在做this,但他们没有解释他们是如何做到的。

有什么建议吗?


更新:我找到了一个可以完成这个任务的脚本,但我不明白为什么:

 ./A < /dev/fd/3 | ./B 3>&-;  3>&1 | :

【问题讨论】:

您的问题被标记为[bash],但您参考了[c++] 文章(仍然没有完成您描述的内容)。您可以在 C/C++ 程序中拥有单独的 进程 或单独的 线程,它们可以作为读取器和写入器,但不能在单个 bash 管道中同时执行这两种操作. (复合命令)。使用两个 shell(单独的脚本),您可以重定向文件描述符以允许从两个不同的源读取,但除非使用临时文件(或某些递归调用设置),否则该过程是一种方式。 我认为在 shell 脚本中是不可能的。 我猜你的意思不仅仅是A | B | A 对吧?但是,如果进入 A 的输入导致进入 B 的输出,然后导致输出进入 A...ad infinitum,那么终止条件是什么,您的最终输出结果是什么预计?如果 B 的输出进入 A 的相同 I 姿态的输入,那么 A 正在读取两个输入流,等等 您应该能够使用命名管道来执行此操作;示例见this answer。 【参考方案1】:

您可以使用socat 实用程序。它将任何东西连接到其他任何东西,包括彼此的两个进程:

socat exec:'A' exec:'B'

【讨论】:

以上是关于如何将 A 的标准输出重定向到 B 的标准输入,将 B 的标准输出重定向到 A 的标准输入?的主要内容,如果未能解决你的问题,请参考以下文章

如何将标准输入重定向到 Windows 命令行中的文件?

重定向标准错误到标准输出 是啥意思

如何将终端输出的信息重定向写入文件中呢?

重定向

2.8 补充:标准输入输出错误输出

Shell重定向