2010-01-12 39 views
2

我有一個程序(grabface),該程序使用網絡攝像頭拍攝人臉圖片,並且我還有一個如下所示的shell腳本包裝器:如果另一個程序返回錯誤,則自動運行程序

在命令行上,用戶爲腳本提供要運行的程序的名稱及其命令行參數。該腳本然後執行給定的命令並檢查退出代碼。如果出現錯誤,程序grabface將運行以捕獲用戶的驚訝表情。

這一切工作得很好。但問題是必須始終使用包裝器腳本。有沒有辦法在shell中輸入命令時自動運行該腳本?或者有什麼其他方式可以在程序運行後自動運行給定的程序?

最好解決方案應該在bash中工作,但任何其他shell也可以。我意識到這可以通過簡單地對shell的源代碼進行一些調整來完成,但這是最後一項措施。

可能更棘手的事情是將其擴展到與在shell以外啓動的程序(例如桌面環境)一起工作,但這可能太困難了。

編輯: Awsome!由於bash非常簡單,其他shell怎麼樣?

回答

4

在Bash中,只要執行的命令返回非零值,就可以使用參數ERRtrap command執行指定的命令。

 
$ trap "echo 'there was an error'" ERR 
$ touch ./can_touch 
$ touch ./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa 
touch: cannot touch `./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa': No such file or directory 
there was an error 

trap影響整個會話,所以你需要通過將其放入.bashrc.profile確保trap被稱爲在會議開始。

1

在用戶的.profile添加:

trap grabface ERR 
2

其他特殊的trap信號即擊理解是:DEBUG,RETURN和EXIT以及所有的系統信號(其可以使用trap -l列出)​​。

Korn外殼有類似的設施,而Z外殼有更廣泛的陷阱能力。

順便說一下,在某些情況下,對於命令行,在Bash中將PROMPT_COMMAND變量設置爲每次發出提示時都會運行的腳本或命令會很有用。

2

只需在您的命令中使用我的錯誤。
false || echo "It failed"

如果你想要做的oposite,它成功的時候一樣,只要把你的命令,而不是真正:
true && echo "It succeeded"

+0

當然,不過這並沒有真正回答這個問題。正如我已經說過,我有一個包裝腳本,基本上這樣做。我想知道的是如何讓腳本運行而不必在shell中輸入任何額外內容(例如,在你的示例中,「|| echo」It failed「') – pafcu 2010-01-12 13:35:00

+0

並不回答海報問題,而是我在尋找。 – rob 2014-09-09 08:22:16

相關問題