如何将键盘输入转发至Bash后台运行的程序?
解决后台进程无法接收键盘输入的问题
你的问题核心是:后台运行的theprogram没有绑定当前终端的标准输入,所以无法接收键盘输入。下面是两种可行的修复方案:
方案一:直接绑定终端输入并等待进程结束
简化脚本逻辑,直接让程序的输入输出关联到当前终端,同时用wait直接等待进程结束,不需要tail的迂回方式:
#!/usr/bin/env bash # 定义PID文件路径(建议替换成实际路径) PROGRAM_PID_FILE="/tmp/program.pid" # 启动程序,将输入输出绑定到当前终端,后台运行并记录PID theprogram >& /dev/tty < /dev/tty & PROGRAM_PID=$! echo $PROGRAM_PID > "${PROGRAM_PID_FILE}" # 等待程序进程结束 wait $PROGRAM_PID
>& /dev/tty:将程序的标准输出和错误输出重定向到当前终端,确保你能看到程序输出< /dev/tty:强制程序从当前终端读取标准输入,这样键盘输入就能传递给它- 直接用
wait等待进程PID,比tail的方式更高效可靠
方案二:保留子shell结构的修复
如果必须保留原脚本的子shell结构,只需在子shell内给程序重定向标准输入,同时替换tail为直接wait:
#!/usr/bin/env bash PROGRAM_PID_FILE="/tmp/program.pid" set -m ( # 重定向stdin到当前终端,启动程序并记录PID theprogram < /dev/tty & echo $! > "${PROGRAM_PID_FILE}" ) set +m # 直接等待目标进程结束 wait $(cat "${PROGRAM_PID_FILE}")
为什么原脚本不行?
原脚本中theprogram在子shell后台运行时,它的标准输入默认继承自子shell,而子shell的stdin并没有关联到当前终端(或者后台进程被shell自动断开了stdin连接),导致键盘输入无法传递到程序进程。通过< /dev/tty重定向,强制程序从当前终端读取输入,就能解决这个问题。
内容的提问来源于stack exchange,提问作者Maestro
相关产品推荐
相关产品推荐

