在 bash 中,我可以创建一个到子 shell 的匿名读写管道吗?

在 bash 中,我可以创建一个到子 shell 的匿名读写管道吗?

我试图将“解析服务”传递给 bash 脚本,作为附加到另一个脚本的读写文件描述符。

因此,给出一个“服务”,例如capitalize

#!/usr/bin/env bash
while true; do read line; echo "${line^}"; done

和一个像这样的客户client

#!/usr/bin/env bash
echo $1 >&3
read line <&3
echo "${line}"

我想拨打电话client foo 3< <(capitalize)并期待输出Foo。此调用失败并显示client: line 2: echo: write error: Bad file descriptor。我认为这是因为 暴露的管道(capitalize已分配fd3并传递给client)是只读的,而不是读写的。

因此,我正在寻找一种语法来创建可以在两个 shell 之间共享的读写管道。也许类似的东西client foo 3<> <>(capitalize),但这不起作用。

提前致谢!


以下是coproc使用交互式 shell 的简单示例:

$ coproc cap { read line; echo ${line^}; }
$ echo ${cap[@]}
59 54
$ echo foo >&54
$ read line <&59
[1]+  Done                    coproc cap { read line; echo ${line^}; }
$ echo $line
Foo

当我将文件描述符发送给我的客户端时,我还没有弄清楚语法......

假设client更新为使用不同的文件描述符进行输入和输出,如下所示:

#!/usr/bin/env bash
echo $1 >&3
read line <&4
echo "${line}"

然后我试试这个...

$ coproc SVC { ./capitalize; }
$ ./client foo 3>&${SVC[1]} 4<&${SVC[0]}
./client: line 2: 3: Bad file descriptor
./client: line 3: 4: Bad file descriptor

为什么 1 和 0 处的文件描述符 SVC 没有被复制到槽 3 和 4 中并传递给./client

嗯..快到了..

相关内容