2013-04-03 34 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