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

如何将键盘输入转发至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:03:25