使用coproc的Bash客户端无法自动退出,如何解决?
解决coproc调用过滤器后客户端无法自动退出的问题
问题核心是过滤器进程的标准输入未收到EOF,导致while read循环一直等待新输入,进而让客户端的cat命令持续阻塞。只需在客户端发送完数据后关闭coproc的写文件描述符,就能让过滤器进程感知输入结束,从而自动退出。
修改后的客户端脚本
#!/bin/bash coproc ./filter echo Bogus >&"${COPROC[1]}" # 关闭coproc的写端,触发过滤器的read命令收到EOF exec {COPROC[1]}>&- cat <&"${COPROC[0]}"
原理说明
- 原客户端脚本发送完
Bogus后,coproc的写管道仍处于打开状态,过滤器的while read会一直等待新输入,不会终止。 - 通过
exec {COPROC[1]}>&-关闭写端后,过滤器的read命令会收到EOF,循环终止,过滤器进程随之退出。 - 过滤器进程退出后,其输出管道会关闭,
cat命令读到EOF后自动退出,整个客户端脚本正常结束。
可选优化:简化过滤器脚本
原过滤器中的管道可以去掉,直接用变量处理提升执行效率:
#!/bin/bash while read line do printf "%s\n" "$line" | tr 'B' 'b' done
内容的提问来源于stack exchange,提问作者Ahmad Ismail
相关产品推荐
相关产品推荐

