BASH陷阱CTRL+;然后完全退出脚本
我在bash脚本中添加了一个陷阱,因此当按下CTRL+C时,会出现一条消息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
您想退出吗?(是/否)
这在脚本的大多数部分有效,但在其他部分无效
我创建了一个简单的例子,说明它总是失败的
#!/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?因为这样做行不通,只会成为一种评论。