![在 bash 中,我可以创建一个到子 shell 的匿名读写管道吗?](https://linux22.com/image/182404/%E5%9C%A8%20bash%20%E4%B8%AD%EF%BC%8C%E6%88%91%E5%8F%AF%E4%BB%A5%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%88%B0%E5%AD%90%20shell%20%E7%9A%84%E5%8C%BF%E5%90%8D%E8%AF%BB%E5%86%99%E7%AE%A1%E9%81%93%E5%90%97%EF%BC%9F.png)
我试图将“解析服务”传递给 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
?
嗯..快到了..