2012-05-17 49 views
3

我對bash腳本還很陌生,而且我很難弄清楚爲什麼這個簡單的陷阱沒有按預期工作。爲什麼這個簡單的bash陷阱失敗

目標 - 創建可選等待期間,可以通過按CTRL + Ç被跳過。

緊迫的預期結果CTRL +Ç - 立即呼應 「!沒時間午睡」並退出。按壓的

實際結果CTRL + Ç - 立即回聲 「小睡之上」並退出。

#!/bin/bash 

nonap() { 
    echo "No time for napping!" 
    exit 
} 

trap nonap INT 

echo "Sleeping for 5 seconds, hit ctrl-c to proceed now." 
sleep 5 
echo "Naptime over." 

爲什麼我的陷阱函數沒有被調用?

+1

這工作對我很好。你的環境是什麼? – Adam

+1

我只是(在bash 3.2.25古老的Linux)嘗試過了,在'trap.sh'保存你的代碼,跑'慶典trap.sh',並得到了:'睡5秒,按Ctrl-C現在繼續當我按照你的意料打斷時,接着是「沒時間打盹!」。 –

+0

感謝您的反饋。至少我知道它*應該*按預期工作。我使用最新版本的Tinycore Linux和GNU bash,版本爲4.0.33(1)的版本(i686-pc-linux-gnu)。在打開一個新終端時,聲明-f nonap和trap都不返回任何輸出。運行此腳本並獲得「午睡」。輸出,'trap'返回'陷阱 - 「非AP」 SIGINT'和'聲明-f在我的腳本中定義nonap'返回的功能。 –

回答

4

我只是(在bash 3.2.25在一個古老的RHEL Linux)的試了一下,在trap.sh保存你的代碼,跑bash trap.sh,並得到了:

Sleeping for 5 seconds, hit ctrl-c to proceed now. 

依次爲:

No time for napping! 

當我打斷你的意見時。當我讓它在不中斷運行,我得到了預期的消息:

Naptime over. 

然後你說:

至少我知道它應該按預期方式工作。我使用最新版本的Tinycore Linux和GNU bash,版本爲4.0.33(1)的版本(i686-pc-linux-gnu)。在打開新的終端時,declare -f nonaptrap都不返回任何輸出。運行此腳本並獲得「午睡」。輸出,trap返回trap -- 'nonap' SIGINTdeclare -f nonap返回我的腳本中定義的函數。

對此我的回答:

你是如何運行此腳本,然後呢?使用source.來讀取它?是啊;你一定是。我只是試過了,而採購中斷給了我Naptime over.;輸入另一箇中斷雖然給我No time for napping!和殼退出。它第二次表現得如預期一樣;點擊腳本時我不確定中斷是怎麼回事。這是意想不到的行爲。

你爲什麼要來源或點這?爲什麼不把它用作簡單的舊腳本?

沒有理由來源...我只是用它來測試時運行它。我想我在使用時從來沒有遇到像這樣的任何異常情況。之前,但我仍然是一個新手。我看到了相同的結果,如果我使用bash運行它,它在第一次中斷時會按預期工作。

嗯,有一個「醫生,醫生,它傷害時,我打我的頭撞牆」組件以下建議,但也有基本的實用主義也有。

您使用source(在C shell或bash)或.(在伯恩,科恩,POSIX殼或bash)有腳本影響調用shell的環境,而不是運行作爲一個子shell。解決問題(儘管主要是通過僥倖)的贈品是當你在運行腳本後報告,你已經定義了該功能;除非您使用source,否則不會發生這種情況。在這種情況下,很顯然你不想在調用shell中設置trap。當我(與提示Toru JL:ksh)跑了,我得到了:

Toru JL: bash 
bash-3.2$ trap 
bash-3.2$ source trap.sh 
Sleeping for 5 seconds, hit ctrl-c to proceed now. 

Naptime over. 
bash-3.2$ trap 
trap -- 'nonap' INT 
bash-3.2$ No time for napping! 
Toru JL: 

的「沒時間午睡!當我再次點擊中斷鍵時出現消息,它終止了我運行的bash。如果您繼續使用source,則需要將trap INT添加到腳本的末尾,並且您可能還想取消定義該功能。

但是,我認爲,將它隔離在一個shell中並將其作爲一個子進程運行它會更好。

但是......當腳本來源時,你發現這種事情玩弄有趣的遊戲很有趣。這是bash行爲中的一個小異常。我不確定它會上升到'錯誤'的水平;我必須仔細閱讀大量的手冊(可能多次),並在聲明「錯誤」之前諮詢其他知識淵博的人員。

我不知道這將是任何安慰,但我想ksh你的腳本.和它的工作,因爲我們倆都期待:

Toru JL: ksh 
$ . trap.sh 
Sleeping for 5 seconds, hit ctrl-c to proceed now. 
No time for napping! 
Toru JL: 
+0

再次感謝您的深思。我正在審查源/。在你發現那是造成問題之後。從我能收集的信息來看,聽起來就像你死了一樣。我不相信這是一個「錯誤」,也許只是一個細微的理由,我沒有完全掌握。 –

+0

除非我有充分理由這樣做,否則我將從現在開始運行所有腳本。所以,你解決了我眼前的問題,並教給我一個關於在這個過程中調用腳本的好教訓。再次感謝! –

+0

+1 - Zsh的行爲與ksh相同。 –