请注意man bash中的这段话(强调我的):
协同进程
协进程是前面带有 coproc 保留字的 shell 命令。协进程在子 shell 中异步执行,就好像命令已用 & 控制运算符终止, 在执行 shell 和协进程之间建立了双向管道。
现在,正如我们所知,与其他 *nix 系统不同,Linux 管道是单向的(还有参考man pipe(7),可移植性部分)。那么 bash coproces 如何在 Linux 上不存在的情况下实现“双向管道”?
请注意man bash中的这段话(强调我的):
协同进程
协进程是前面带有 coproc 保留字的 shell 命令。协进程在子 shell 中异步执行,就好像命令已用 & 控制运算符终止, 在执行 shell 和协进程之间建立了双向管道。
现在,正如我们所知,与其他 *nix 系统不同,Linux 管道是单向的(还有参考man pipe(7),可移植性部分)。那么 bash coproces 如何在 Linux 上不存在的情况下实现“双向管道”?
它为 stdin 制作一个,为 stdout 制作一个,与子进程的管道始终工作的方式相同。这就是为什么你在一个数组中得到两个 fd。每个管道的一端在父节点中(作为数组中的 FD),每个管道的一端在子节点中(作为 fd 0 和 fd 1,标准输入和标准输出)。在孩子中写入 fd 1 可以让您从中读取一些东西
COPROC[0]
,反之亦然,用于标准输入。此设置也在您引用的段落的手册页中进行了描述。没有什么特别的,它在所有系统上使用标准函数做同样的事情,不管本地管道如何在 POSIX 提供的之上工作。
pipe