有一个脚本通过“按y / n”对话框与用户交互(即stdin已经在使用中)。按下预定义的键盘按钮,主脚本应该中断其工作。
我尝试用两种方式实现它,读取并使用 grep (啊,并尝试使用 stty - stty -echo - icanon时间0分0,但总而言之它没有用。)
grep(grep -q)的问题是主线程进入了一个带有grep的循环(我为了不断检查stdin而循环),而我需要主脚本继续前进,只需要监听STDIN按下特定键。 通过 read ,它最终转化为如此小的一块:
breakByButton()
{
while ! [ "$z" = "11" ]
do
read -t 1 -n 1 key
if [[ $key = <desired key> ]]
then
echo -e "\n\e[31mStopped by user\e[0m"
break
fi
done
}
当然,此功能仅适用于调用它的位置。作为后台的单独脚本以及grep,在第一次按Enter键后中断执行。 现在我正在考虑并行过程 - 脚本和阅读,但尚未做出决定。
答案 0 :(得分:1)
这就是中断的原因。如果要中断使用stdin的进程,请键入ctrl-C。这会中断进程,并可选择将控制权传递给中断处理程序。例如,在此脚本中MyExit
用作中断处理程序。如果您运行此脚本并键入Ctrl-C,则执行将停止,并显示所需的消息:
MyExit() {
echo -e "\n\e[31mStopped by user\e[0m"
exit
}
trap MyExit INT
while true
do
# do something important that captures stdin
cat >/dev/null
done
实际上,MyExit
也应该在脚本执行中断后执行清理所需的任何操作。这通常包括,例如,删除临时文件。
即使 stdin已在使用,此方法的关键功能仍然有效。它不需要等待stdin可用。
答案 1 :(得分:1)
虽然完全不知道你真正需要什么,但请尝试下一个演示(按q
退出)
trap 'stty sane;exit' 0 2
do_quit() {
echo -e "Quit....\r" >&2
return 1
}
do_something() {
echo -e "Doing something after the key: $key\r"
}
inkey() {
stty raw
while :
do
read -t 1 -n 1 key
case "$key" in
q|Q) do_quit || exit ;;
'') ;; #nothing
*) do_something "$key" ;;
esac
done
}
#main
inkey