监听用户输入,无需等待执行其他进程

监听用户输入,无需等待执行其他进程

好的,我有一个简单的脚本,其结构如下。我有一个将无限期运行的子进程。截至目前,只有当用户手动终止进程时它才会停止。我想知道是否有一种方法可以监听用户的输入而不被困在线路上read。换句话说,当子进程运行时,在后台查看用户是否\n在终端中键入“quit”。

...

if [[ option = "3" ]]; then
    while [2 -lt 4]; #THIS IS WHERE I WANT TO CHANGE TO LISTENING FOR INPUT TO QUIT
        #Some sub process that continues to run
    done
fi

....

谢谢您的帮助!抱歉,如果措辞不好,我想不出更好的方法来描述这个问题。至于我的集思广益尝试,我知道可以在while条件中使用一个变量并说这样做直到它等于“退出”,但是将该变量设置为输入是我迷失的地方。

答案1

您可以在后台运行进程(使用&),然后read也可以在后台从用户运行 a,并等待其中任何一个完成。你最终会得到类似的东西

mylongrunningcommand &
pid1=$!
echo "enter quit to stop"
while read reply && [ quit != "$reply" ]
do  :
done </dev/stdin &
pid2=$!
wait -n
echo "got quit or command done"
kill -9 $pid1 $pid2
wait

read位于一个循环内,因此您可以多次尝试输入“quit”。由于后台,它需要将标准输入重定向到它。当任一后台作业完成时就会wait -n返回,并且kill会杀死两个作业的进程ID,因为我们不知道哪个作业结束了。

上面的代码从 bash 中生成了一些有关被终止的进程的消息。如果你想抑制这些,请将最后两行替换为

exec 3>&2 2>/dev/null
kill -9 $pid1 $pid2
wait
exec 2>&3 3>&-

这会暂时将 stderr 移动到/dev/null.

相关内容