Bash:将键盘输入转发到后台程序?

Bash: Forward keyboard input to background program?

提问人:Maestro 提问时间:9/25/2023 最后编辑:Maestro 更新时间:9/25/2023 访问量:65

问:

我有一个 bash 脚本,我在子 shell 中生成一个程序并等待它完成:

#!/usr/bin/env bash

set -m
(
  theprogram & echo $! > "${PROGRAM_PID}"
)
set +m

tail --pid "$(cat "${PROGRAM_PID}")" --follow /dev/null & wait $!

问题是,当用户按下任何键时,该程序不会收到它们。我想这是由于它在不同的进程中运行而引起的。

那么有没有办法将所有键盘输入重定向到这个 PID?

bash 键盘 tty subshell

评论

0赞 choroba 9/25/2023
这是因为程序在后台运行(由 ).阅读 中的“作业控制”。&man bash
0赞 Maestro 9/25/2023
@choroba 是的,我已经怀疑过了,但我需要它留在后台。那么有什么方法可以将所有按键转发到这个后台程序呢?
0赞 jared_mamrot 9/25/2023
也许你可以用期望来做到这一点,例如 stackoverflow.com/questions/77144806/......?我认为通常当您在后台运行某些东西时,您不想与之交互,所以不确定是否有“简单”的解决方案对不起
2赞 Gordon Davisson 9/25/2023
来自 bash 手册:“尝试读取(写入)终端的后台进程由终端驱动程序发送 SIGTTIN (SIGTTOU) 信号,除非被捕获,否则该信号将暂停该进程。所以我认为你需要把它放在前台,而不是在背景中。tail
1赞 user1934428 9/25/2023
我不知道它是否有效,但也许可以用来控制 QEMU。这个想法是你也在后台运行(与QEMU一起),但是你可以自己设计的期望程序可以通过某种方式(例如,通过套接字)获取击键。这意味着您必须编写两个程序:一个在前台运行,它接收来自用户的输入并将其发送到(即)套接字,另一个在后台运行的 expect-program 从套接字获取输入并使用它来驱动 QEMU。expectexpect

答: 暂无答案