2015-10-06 77 views
2

我下的印象是exit將終止當前的bash腳本不管是什麼,並且有以下錯誤處理程序在我的腳本的頂部:

function err { 
    printf "\e[31m$1\e[0m\n" 1>&2 
    exit 1 
} 

它的工作像大多數情況下,魅力直到這條線:

item=$(myfunc $1) 

通常情況下,該行正常工作,與MYFUNC的STDOUT倒入$item,如預期。當myfunc通過上面看到的err函數引發錯誤時,會出現此問題。 $()最終吞噬非零回報,並防止退出退出腳本本身。如果我理解正確,問題是$()實際上產生了一個新的子shell(就像棄用的反引號一樣),但是我知道沒有其他方法將函數的輸出捕獲到bash中允許exit工作的變量中。

我也嘗試過使用set -e,並且沒有任何運氣。有人可以建議如何構建我的錯誤處理程序,以便在這些情況下退出腳本嗎?

+1

'$()'最終吞噬了一切,因爲*命令替換*在* subshel​​l *中佔有一席之地。什麼是關於subshel​​l的bash規則? *子外殼中沒有任何操作可以影響父進程... *是的,您可以返回退出狀態('$?'),但您無法執行其他任何操作。 –

回答

5

可以測試分配的結果:

if item=$(myfunc "$1") 
then : Function worked 
else : Function failed 
fi 

這個測試運行的命令在子shell的$(…)用途退出狀態。


實際上並沒有使用功能,您可以體驗:

$ if item=$(echo Hi; exit 1); then echo "$item - OK"; else echo "$item - OH"; fi 
Hi - OH 
$ if item=$(echo Hi; exit 0); then echo "$item - OK"; else echo "$item - OH"; fi 
Hi - OK 
$ 

或者,如果功能被認爲是至關重要的,那麼:

$ err() { exit $1; } 
$ myfunc() { echo Mine; err $1; } 
$ if item=$(myfunc 1); then echo "$item - OK"; else echo "$item - OH"; fi 
Mine - OH 
$ if item=$(myfunc 0); then echo "$item - OK"; else echo "$item - OH"; fi 
Mine - OK 
$ 

使用bash 3.2.57在Mac OS測試X 10.11埃爾卡皮坦。

+0

嗯,不管怎樣,它似乎總是會爲我工作的情況。也許出於同樣的原因,大衛建議的'$?'也總是保持爲0.看起來這是吃掉退出標誌的任務。 –

+0

這適用於我。 +1。我用'a = $(false)測試了它; echo code = $?'和'a = $(true);回聲代碼= $?'。 @Alexander,如果它不適合你,請確保'myfunc'(你沒有告訴我們)正確設置退出代碼。 – John1024

+0

只是不要在命令提示符下調用'err' ... –

0

爲了什麼值得你也不能使用bash短路評估來測試函數的退出狀態。它將測試賦值給變量。

例如。 而

[[ $(myfunc "$1") ]] && echo success || echo failure 

[[ myfunc "$1" ]] && echo success || echo failure 

是相當普遍的,可能做什麼的預期,

[[ item=$(myfunc "$1") ]] && echo success || echo failure 

始終返回即使MYFUNC返回非零成功。您必須使用if和else來測試退出狀態。