通过ENTER或ESC等键在bash中创建中断

时间:2017-05-18 06:16:48

标签: linux bash shell

我需要知道是否可以使用ESCENTER等键来中断bash脚本?通过发送SIGINT /CTRL + C我能够做到,但由于某些原因(在最后一行检查说明)我无法使用CTRL +C。所以我需要一些自定义方式来引起中断。

换句话说:在以下脚本中,按下cleanup时会调用CTRL + C函数。现在需要修改此行为,以便在按下cleanupENTER等某些键时调用ESC函数。

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. 如果可能,如何实现呢?
  3. 注意:

    原因:此脚本是从另一个具有自己的陷阱处理的C ++程序调用的。因此,此脚本的陷阱处理与父程序冲突,最终终端挂起。在我的组织中,程序的代码被冻结,所以我不能改变它的行为。我只需调整这个子脚本。

2 个答案:

答案 0 :(得分:1)

以下作品^ M表示ENTER和^ [表示ESC但可能

stty intr ^M 
stty intr ^[ 

但之后无法使用ENTER 恢复默认

stty intr ^C

评论之后,因为shell是交互式的,要求继续而不是使用陷阱,也可以在特殊的EXIT陷阱中完成清理。

How do I prompt for Yes/No/Cancel input in a Linux shell script?

或使用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

答案 1 :(得分:0)

这是一个脏技巧,它正在我的工作中做得很好。 readcase语句选项是关键。在这里,我将超时read命令,以便在按下escenter时继续为true。

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