2013-04-03 37 views
19

在bash中是否有可能拦截SIGINT,执行某些操作,然后忽略它(保持bash运行)。在bash中捕获SIGINT,处理AND ignore

我知道,我可以忽略SIGINT与

trap '' SIGINT 

而且我还可以做一些对SIGINT与

trap handler SIGINT 

handler执行后仍然会停止脚本。例如。

#!/bin/bash 

handler() 
{ 
    kill -s SIGINT $PID 
} 

program & 
PID=$! 

trap handler SIGINT 

wait $PID 

#do some other cleanup with results from program 

当我按ctrl + c时,SIGINT到节目将被发送,但bash将跳过wait BEFORE程序正常关闭,并在其信号处理程序创建它的输出。

使用@suspectus答案我可以改变wait $PID到:

while kill -0 $PID > /dev/null 2>&1 
do 
    wait $PID 
done 

这实际上对我的作品只是我不是100%肯定,如果这是“干净”或“肮脏的解决办法”。

+2

为什么要多次打印? – cnicutar

+0

@cnicutar:如果我按ctrl + c多次(我不能以当前的形式,因为它在第一个之后停止) – Zulan

+0

我改变了我的示例以更接近实际用例。 – Zulan

回答

4

陷阱将从处理程序返回,但调用处理程序时调用的命令。

所以这个解决方案有点笨拙,但我认为它确实需要。 trap handler INT也将工作。

trap 'echo "Be patient"' INT 

for ((n=20; n; n--)) 
do 
    sleep 1 
done 
+0

1.不工作; 2.这可能不是用户想要的。 – anishsane

+0

如果陷阱被触发(这样做,你需要用'sleep 1&wait'替换'sleep 1'),循环在按下Control-C之后退出;在陷阱返回后,您不会继续运行信号发生的地方。 – chepner

+1

@anishsane 2.用户需要什么?我认为用户想要陷入信号情境并保持对他的剧本的控制。 – suspectus