如何使 Bash 的读取在捕获中断后中止?

How to make Bash's read abort after trapping interrupt?

提问人:William Pursell 提问时间:12/8/2017 最后编辑:codeforesterWilliam Pursell 更新时间:12/8/2017 访问量:344

问:

考虑:

$ cat b.sh
#!/bin/bash

trap 'echo $$ was interrupted' INT
read foo
echo done
$ ./b.sh
^C27104 was interrupted
^C27104 was interrupted
^C27104 was interrupted
done
$ 

(Ctrl-C 被击中 3 次,然后是 Ctrl-D)

我希望在执行陷阱后中止。有没有一种干净的方法可以做到这一点?read

bash 信号

评论

0赞 William Pursell 12/8/2017
我不想退出脚本,只是打断阅读。
0赞 Inian 12/8/2017
这可能很有用 无法使用 Ctrl+C 停止 bash 脚本

答:

9赞 randomir 12/8/2017 #1

似乎不立即中断是 Bash 非 POSIX 扩展(参见 Bash 内置源代码(查找))。read_builtinread.defposixly_correct

您可以覆盖此行为,并通过强制 POSIX 行为(通过设置环境变量)在第一个行为上退出:Ctrl+CreadPOSIXLY_CORRECT

#!/bin/bash
trap 'echo $$ was interrupted' INT
POSIXLY_CORRECT=1 read foo
echo done

评论

4赞 clt60 12/8/2017
每天都在学习新东西 - 这实际上是一个完美的答案。+++ :)
2赞 randomir 12/8/2017
@jm666,谢谢。我只是通过偷看来源自己发现了这一点。:)
0赞 Cyrus 12/8/2017
@randomir:你用的是哪个版本的 Bash?
0赞 randomir 12/8/2017
@Cyrus,Bash 4.3。