鉴于此循环:
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 和它调用的命令忽略。[...] 进入外壳时被忽略的信号无法被捕获或重置。