2016-08-16 51 views
5

這是我的腳本;如何在不關閉xterm的情況下捕獲SIGINT?

#!/bin/bash 
trap '' SIGINT 
xterm & 
wait 

我運行它,xterm彈出。然後,我將我的鍵盤對準始發終端窗口,並擊中^C。我不希望發生任何事情,但相反,孩子xterm會消失。

(理想情況下,我想安裝我自己的陷阱處理程序,但這是一個小步)

使用disown分叉的xterm分離從父在xterm後再^C沒有做任何事情由xterm,但是然後wait不起作用。

我只想阻止SIGINT到達xterm。

回答

2

當您將SIGINT發送到bash腳本時,信號會傳播到腳本中的當前進程,然後它會在陷阱中執行命令。所以「等待」中斷。你必須這樣做,「等待」再次運行。

此外,您還必須確保所有工作都在其自己的流程組中啓動(set -m)。從一組手冊頁:

集-m

監控模式。作業控制已啓用。默認情況下,此選項用於支持它的系統上的交互式shell(請參閱上面的JOB CONTROL)。後臺進程在單獨的進程組中運行,並在完成時打印包含其退出狀態的行。

#!/bin/bash 
set -m 
trap 'R=true' SIGINT 
xterm & 
while : ; do 
    R=false 
    wait 
    [[ $R == true ]] || break 
done 

你可以看到,它與家當「-x」選項運行命令。

2

CTRL+C將發送SIGINT信號給前臺進程的同一組下的每個進程。所以xterm也會消失。您可以使用setsid更改xterm的組標識。

#!/bin/bash 
trap 'echo "Caught SIGINT"' SIGINT 
setsid xterm & 
wait 

waitSIGINT被打斷了。因此,如果您想在CTRL+C後按wait,則需要根據@fbohorquez的建議再次等待。

#!/bin/bash 
trap 'R=true;echo "Caught SIGINT"' SIGINT 
setsid xterm & 
while : ; do 
    R=false 
    wait 
    [ $R == false ] && break 
done 
+0

那麼等待工作嗎? – heemayl

+0

@heemayl'wait'也會被'SIGINT'中斷。所以如果你想在按下CTRL + C後「等待」,你必須像@fbohorquez所做的那樣再次「等待」。 –

相關問題