如何让Ctrl+C在Bash中始终正常终止while循环?
Bash循环无法被Ctrl+C终止的解决方法
原代码的问题在于:当按下Ctrl+C终止foo bar时,foo bar会返回非0退出状态(被SIGINT终止时通常为130),!取反后变为0,导致循环继续执行。同时循环体的:是Bash内置空命令,执行速度极快,Bash几乎没有机会处理SIGINT信号,看起来就像循环无法终止。
以下是几种可行的解决方式:
方法一:设置SIGINT陷阱
显式捕获SIGINT信号,触发时直接退出函数:
func() { trap 'return' INT while ! foo bar; do :; done }
也可以用等价的until写法:
func() { trap 'return' INT until foo bar; do :; done }
方法二:检查退出状态处理信号终止情况
在循环内捕获foo bar的退出状态,判断是否是被SIGINT终止,若是则退出循环:
func() { while true; do foo bar && break local exit_code=$? # 130是进程被SIGINT终止的典型退出码 if [ "$exit_code" -eq 130 ]; then return "$exit_code" fi done }
方法三:让循环体有机会处理信号
在循环体内加入一个能让Bash暂停并处理信号的命令,哪怕是0秒休眠,也能让Bash处理待处理的信号:
func() { while ! foo bar; do sleep 0 done }
内容的提问来源于stack exchange,提问作者user541686
相关产品推荐
相关产品推荐

