在 Bash 5 中,我遇到了我想要执行以下操作的情况:
trap 'echo trapped!' USR1
while true; do kill -SIGUSR1 $$; sleep 1; done &
但是每次发送信号时我都必须在键盘上按 enter 才能使陷阱代码继续。
实际上,我希望在没有任何键盘交互的情况下执行陷阱。
编辑:
最后我让它像这样工作:
trap 'echo trapped!' USR1
while true; do kill -USR1 $$; kill -INT $$; sleep 1; done &
但我认为解决方案是解决方法,而不是答案。
有人似乎在这里有一个非常相似的问题。
长话短说,如果可以从子进程中内置的陷阱执行命令(在这种情况下为“回声陷阱!”)。您可以将命令放在文件中(例如
a.sh
):bash a.sh &
并以后台进程执行文件当这种情况发生时(你已经注意到它确实处理了 SIGINT)。上述解决方案有效,因为陷阱位于非交互式外壳中(因此,当它收到信号时,它不在阻塞读取的中间)。