2013-11-10 20 views
6

這是一個簡單的問題。爲什麼會出現這種不行爲的方式,我認爲它會:括號內的`exit`不會退出腳本

(echo "Test 1"; exit) && echo "Test 2" 

......或者......

VAR1=1 
VAR2=2 
[ $VAR1 == $VAR2 ] || (echo '$VAR1 does not equal $VAR2, exiting.'; exit) 
echo -e 'Well, I\'m still alive yo!' 

運行的是這兩個中的問題將導致腳本執行繼續,儘管明確exit命令。

很明顯括號是由於某種原因影響命令,我的問題是爲什麼?

回答

7

圓括號在子外殼中執行其內容,因此它是退出的子外殼。

您通常可以使用另一個&&或使用{}而不是()實現相同的效果。

{ echo "Test 1"; exit; } && echo "Test 2" 

或者

echo "Test 1" && exit && echo "Test 2" 
+0

如何在不使用所述'subshel​​l'的情況下完成上述操作? – jduncanator

+0

用凱文給出的這兩個例子,你不會使用子殼;) –

1

(...)內容在子Shell中執行,所以你只要exit這個殼。這種做法應該更好地爲你和它更容易閱讀的維持旁邊的人一起去,打開你的腳本:

VAR1=1 
VAR2=2 
if [ $VAR1 == $VAR2 ] ; then 
    echo -e "Well, I'm still alive yo!" 
else 
    echo "$VAR1 does not equal $VAR2, exiting." 
    exit 
fi 
1

只是刪除括號,它應該做你想做的。

括號相當於將其內容放入另一個shell腳本,其中exit剛剛退出該shell腳本。

0

http://tldp.org/LDP/abs/html/subshells.html

嵌入括號之間的命令列表運行作爲一個子shell。

(command1; command2; command3; ...) 

大括號之間的代碼塊不會啓動子shell。

{ command1; command2; command3; . . . commandN; } 

在第一情況下,退出正被子殼終止,並將控制返回到調用殼運行。