bash陷阱:在处理ctrl + c之前让命令完成

时间:2015-12-11 23:42:34

标签: bash

在当前运行的命令完成后应该执行

陷阱,但在下面的例子中按Ctrl + C它会在10秒结束之前中断当前命令(sleep),打印消息“SIGINT received”然后立即开始下一次睡眠:

#!/bin/bash

trap 'echo SIGINT received' INT

counter=0
while true
   do
   let counter=counter+1
   echo start sleeping period $counter
   sleep 10
done

我使用陷阱有什么问题吗?如何在不使用子进程或子shell的情况下实现让当前命令在按Ctrl + C后完成的行为(这种方式显示为here)?

1 个答案:

答案 0 :(得分:0)

Ctrl + C会中断当前前景组,在您的情况下,它既是脚本本身又是休眠。

由于sleep在SIGINT上死亡,它会立即退出。这会导致立即打印消息。

如果您希望能够在没有死亡的情况下向您的进程发送SIGINT,您可以在启动进程之前忽略该信号,并希望该进程不会重置信号操作(大多数程序不会): / p>

#!/bin/bash

trap 'echo SIGINT received' INT

counter=0
while true
   do
   let counter=counter+1
   echo "start sleeping period $counter"
   ( trap '' INT; exec sleep 10; )
done