好的,我有一个简单的脚本,其结构如下。我有一个将无限期运行的子进程。截至目前,只有当用户手动终止进程时它才会停止。我想知道是否有一种方法可以监听用户的输入而不被困在线路上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
.