如何将 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 的标准输入?的主要内容,如果未能解决你的问题,请参考以下文章