2013-05-13 60 views
3

我有一個bash shell腳本。它寫出到一個文本文件。它的大部分工作發現,如果我在命令級別用control-c停止腳本。有時,一直寫到如bash shell:control-c會導致shell寫一個空文件嗎?

echo "hello world" >myfile.txt 

文件最終會是空的。所以有可能,當我點擊control-c來停止shell腳本運行時,它會在它打開文件寫入的實例中捕獲它,並且在它放入任何東西之前,它沒有得到機會並保留它空?

如果是這樣的話。我可以在bash shell腳本中執行什麼操作,以便它在寫入文件之後,在它有機會再次寫入文件之前正常退出,因爲它在while循環中執行此操作。謝謝!

回答

3

是的,最終有可能是空文件。

一個解決辦法是陷阱多數民衆贊成由^ C(SIGINT)引起的信號,並設置一個標誌,你可以在你的循環檢查:

triggered=0 

trap "triggered=1" SIGINT 

while true 
do 
    if [ $triggered = 1 ] 
    then 
    echo "quitting" 
    exit 
    fi 
    ...do stuff... 
done 

編輯:沒有意識到,即使shell自己的SIGINT處理將被困住,它仍然會將SIGINT傳遞給它的子進程,如果它們自己不處理SIGINT,它們將會被殺死。

由於echo是殼內膽,它可能存活下來,但我不完全確定。快速測試似乎可以正常工作(文件總是被寫入,而沒有陷入SIGINT,我偶爾也會結束一個空文件)。

由於@spbnick建議在註釋中,在Linux上,您可以使用setsid命令爲您啓動的任何子進程創建一個新的進程組,以防止它們被髮送到shell的SIGINT殺死。

+0

感謝您的有用答覆。因此,上述陷阱控制c,並強迫它關閉它打開的文件?它是「退出」,因爲它默認退出0? – Edward 2013-05-13 05:18:34

+0

退出腳本的責任從shell移到腳本本身(使用'if'語句)。所以如果你正在用'do stuff'寫一個文件,它會繼續這樣做;在循環的下一次運行中,腳本會檢查^ C是否被捕獲,並且它很好地退出。 – robertklep 2013-05-13 05:21:56

+0

雖然我只注意到shell仍然將SIGINT傳遞給它的子進程。所以它可能不工作畢竟:( – robertklep 2013-05-13 05:25:12

相關問題