按下特定按钮停止脚本(在脚本处理时听STDIN)

时间:2014-09-10 20:17:03

标签: linux bash shell

有一个脚本通过“按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键后中断执行。 现在我正在考虑并行过程 - 脚本和阅读,但尚未做出决定。

2 个答案:

答案 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