使用像ENTER或ESC这样的按键在bash中创建中断。

3
我需要知道是否可以使用像ESC或ENTER这样的键来中断bash脚本?通过发送SIGINT / CTRL + C,我可以执行,但由于某些原因(请检查最后一行的注释),我无法使用CTRL + C。因此,我需要有一种自定义方式来引起中断。
换句话说,在以下脚本中,当按下CTRL + C时,将调用cleanup函数。现在需要修改此行为,以便在按下某些键,如ENTER或ESC时,应调用cleanup函数。
cleanup() {

#do cleanup and exit
echo "Cleaning up..."
exit;

}
echo "Please enter your input:"
read input

    while true
        do
          echo "This is some other info MERGED with user input in loop + $input"
          sleep 2;
          echo "[Press CTRL C to exit...]"
          trap 'cleanup'  SIGINT
        done

查询:

  1. 在bash中是否可以使用自定义键来引起中断?
  2. 如果可以的话,如何实现?

注意:

原因:该脚本是从另一个C ++程序调用的,该程序具有自己的陷阱处理。因此,该脚本的陷阱处理与父程序冲突,最终导致终端挂起。在我的组织中,该程序的代码已被冻结,因此我无法更改其行为。我只能调整此子脚本。

2个回答

2

这里有一个非常有效的“小技巧”,可以帮助完成我的工作。使用readcase语句选项是关键。在这里,我会对read命令进行超时处理,因此只有当按下escenter键时,才会停止循环。

cleanup() {

#do cleanup and exit
echo "Cleaning up..."
exit;

}

exitFunction()

{
echo "Exit function has been called..."
exit 0;
}
mainFunction()
{
    while true
        do
          echo "This is some other info MERGED with user input in loop"
          IFS=''
          read -s -N 1 -t 2 -p  "Press ESC TO EXIT or ENTER for cleanup" input
          case $input in
                $'\x0a' ) cleanup; break;;
                $'\e'   ) exitFunction;break;;
                      * ) main;break;;
          esac
        done
}

mainFunction

$'\e' 匹配不仅仅是 ESC,还包括箭头和功能键。 - Pascal Polleunus

1

以下内容可以用^M表示回车,用^[表示ESC,但可能会

stty intr ^M 
stty intr ^[ 

但在恢复默认值后无法使用回车键。
stty intr ^C

在注释后,由于shell是交互式的,询问是否继续而不是使用trap,还可以在特殊的EXIT trap中进行清理。

如何在Linux shell脚本中提示Yes/No/Cancel输入?

或者使用select的另一种解决方案

echo "Do you want to continue?"
PS3="Your choice: "

select number in Y N;
do
    case $REPLY in
    "N")
        echo "Exiting."
        exit
        ;;
    "Y")
        break
        ;;
    esac
done
# continue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接