2014-12-30 50 views
2

當調用一個期望返回的函數而不期望返回的函數時,我並不完全清楚bash的exit關鍵字的方式/原因。如何退出預計返回的bash函數

例如,在下面的攝製:

#!/bin/bash 
exitfunc() 
{ 
    echo "Flag 1" 
    exit 
} 
exitfunc 
echo "We should never see this." 

我們看到的輸出:

$ ./z.bash 
Flag 1 

然而,在此略作修改:

#!/bin/bash 
exitfunc() 
{ 
     echo "Flag 1" 
     exit 
} 
foo=exitfunc 
echo "We should never see this." 

輸出顯示功能顯然不會退出shell。

$ ./z.bash 
We should never see this. 

看來,在所述第二版本的Flag 1是存儲在FOO,可能存儲的錯誤代碼的值。我的問題是,爲什麼exit在用這種方式調用的函數中有這種行爲?它是否在函數期望返回時打開新的shell?人們應該如何正確退出這些功能之一?我是否需要檢查foo的輸出值,並且包括exit捕捉器一直向上調用堆棧?

謝謝。

回答

4

當您撥打:

foo=$(exitfunc) 

或老式:

foo=`exitfunc` 

功能exitfunc在叉形子殼由於命令替換執行,因此僅exit結束該子殼或子殼不是當前殼。因此foo賦值被打印,因爲這個回顯在當前shell中執行,所以echo語句。

4

當你做foo=exitfunc時,你正在給變量foo分配一個字符串exitfunc,而不是執行一個函數。爲了執行該功能,您應該改爲foo=$(exitfunc)。然後變量foo將包含函數「標誌1」的輸出。這被稱爲命令替換。

exit的調用終止執行該函數的子shell,而不是調用它的shell。爲了退出主機外殼,你可以做這樣的事情:

#!/bin/bash 
exitfunc() 
{ 
     echo "Flag 1" 
     exit 1 
} 
foo=$(exitfunc) || exit 
echo "We never see this." 

退出狀態不爲零,所以最後一行之前主機外殼退出。

函數的返回代碼存儲在變量$?,所以如果你想在退出之前使用$foo,你可以做這樣的事情:

#!/bin/bash 
exitfunc() 
{ 
     echo "Flag 1" 
     exit 1 
} 
foo=$(exitfunc) 
e=$? 
echo "$foo" 
if [ $e -ne 0 ]; then exit; fi 
echo "We never see this." 

輸出:

Flag 1