我正在编写一个 shell 包装脚本,它应该充当寻呼机(在 stdin 上接收输入并在 tty 上执行输出)。
该包装器准备环境和命令行,然后在管道中启动两个进程:第一个是非交互式过滤器,最后一个是需要控制 tty 的实际寻呼机(或者,它生成实际的寻呼机本身):
#!/bin/bash
...
col -bx | bat "${bat_args[@]}" --paging=always
最终的进程树如下:
<parent>
\- wrapper.sh
|- col -bx (dies)
\- bat ...
\- less ...
该col -bx
进程在过滤输入后退出,并由 shell 收获。
是否有可能摆脱 shell 进程,以使其在寻呼机运行时不会一直处于挂起状态?
我想到了一个使用进程替换的解决方法:
exec bat "${bat_args[@]}" --paging=always < <(col -bx)
但是,col -bx
进程不会被 shell 回收,而是保持 Z 状态。有没有“正确”的方式来编写这个包装器?