如何让 ctrl+c /not/ 中断 while 循环?

bos*_*bos 13 bash

鉴于此循环:

while sleep 10s ; do
  something-that-runs-forever
done
Run Code Online (Sandbox Code Playgroud)

当我按 Ctrl+C 时,整个 while 循环被中断。我想要做的是中断“某事”过程,让 10 秒过去,然后重新启动“某事”。

如何让 ctrl+c 只影响“某事”,而不影响 while 循环?

编辑:“中断”如在 SIGINT 中。杀。中止。终止。不是“暂停”中的“中断”。

ilk*_*chu 19

如果你只是trap SIGINT为了某事,它应该有效。喜欢:true)。

#!/bin/sh
trap ":" INT    
while sleep 10s ; do
    something-that-runs-forever
done
Run Code Online (Sandbox Code Playgroud)

中断something...现在不会使 shell 退出,因为它会忽略信号。但是,如果您 ^Csleep进程,它将以失败退出,并且循环因此而停止。将 移动sleep到循环内部或添加类似|| true以防止这种情况发生。

请注意,如果您使用trap "" INT完全忽略信号(而不是为其分配命令),则它在子进程中也会被忽略,因此您也不能中断something...。至少在Bash 的手册中明确提到了这一点:

如果arg是空字符串,则每个sigspec指定的信号将被 shell 和它调用的命令忽略。[...] 进入外壳时被忽略的信号无法被捕获或重置。