You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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]}"

原理说明

  1. 原客户端脚本发送完Bogus后,coproc的写管道仍处于打开状态,过滤器的while read会一直等待新输入,不会终止。
  2. 通过exec {COPROC[1]}>&-关闭写端后,过滤器的read命令会收到EOF,循环终止,过滤器进程随之退出。
  3. 过滤器进程退出后,其输出管道会关闭,cat命令读到EOF后自动退出,整个客户端脚本正常结束。

可选优化:简化过滤器脚本

原过滤器中的管道可以去掉,直接用变量处理提升执行效率:

#!/bin/bash

while read line
do
    printf "%s\n" "$line" | tr 'B' 'b'
done

内容的提问来源于stack exchange,提问作者Ahmad Ismail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:49:53