BASH陷阱CTRL+;然后完全退出脚本

BASH陷阱CTRL+;然后完全退出脚本,bash,exit,bash-trap,Bash,Exit,Bash Trap,我在bash脚本中添加了一个陷阱,因此当按下CTRL+C时,会出现一条消息您想退出吗?(是/否) 这在脚本的大多数部分有效,但在其他部分无效 我创建了一个简单的例子,说明它总是失败的 #!/bin/bash quit() { echo "Do you want to quit ? (y/n)" read ctrlc if [ "$ctrlc" = 'y' ]; then exit fi } trap quit SIGINT trap quit SIGTERM while

我在bash脚本中添加了一个陷阱,因此当按下CTRL+C时,会出现一条消息
您想退出吗?(是/否)

这在脚本的大多数部分有效,但在其他部分无效

我创建了一个简单的例子,说明它总是失败的

#!/bin/bash

quit() {
echo "Do you want to quit ? (y/n)"
  read ctrlc
  if [ "$ctrlc" = 'y' ]; then
    exit
  fi
}

trap quit SIGINT
trap quit SIGTERM

while true; do
    echo -e "\n\e[91mIs everything done ? (y/n)\e[0m"
    read -i "y" -e yn
    case $yn in
        [Nn]* ) continue;;
        [Yy]* ) 

        echo -e "Done"
        break;;
        * ) echo -e "\e[91mPlease answer yes or no.\e[0m";;
    esac
done
为什么当我按CTRL+C时会弹出
你想退出?(是/否)
但不允许我退出?我如何解决它


谢谢

上述代码在bashshell中运行时没有任何错误。我怀疑您在dashSHELL中运行了脚本(某些机器的默认SHELL是dash

使用以下方法运行脚本

/bin/bash

为脚本文件(chmod 777 script.sh)授予执行权限,并按如下方式运行该文件


./script.sh

正如我在上面所评论的那样-在函数内部,exit被视为return的同义词,并且不会终止程序。如果这是你的问题,试试看

kill -term $$ # send this program a terminate signal
而不仅仅是退出。这很严厉,但通常很有效


请注意,如果您还有一个SIGTERM陷阱将被执行。

在bash 3.2.57和4.4.12中它对我有效(在我从读取中删除-I和-e之后)。问题似乎是
-e
。将
-e
添加到trapA侧注释中的读取-在函数中,
退出
被视为
返回
的同义词,并且不会终止程序。对于陷阱调用的函数是否有一些特殊的豁免?…您的
#上方是否有一个空行/bin/bash
shebang?因为这样做行不通,只会成为一种评论。