2013-11-10 10 views
6

ここには簡単な質問があります。これら二つのスニペットのいずれかが明示的exitコマンドにもかかわらず、継続的なスクリプトの実行になります実行カッコ内の `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!' 

:なぜこれが、私はそれはと思うように動作しません。 。

括弧が何らかの理由でコマンドに影響を与えていることは明らかですが、私の質問はなぜですか?

答えて

7

括弧はサブシェルで内容を実行するため、終了するサブシェルです。

通常、別の&&を使用するか、()の代わりに{}を使用して同じ効果を達成します。 (...)

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

それとも

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

上記の「サブシェル」を使用しないと、どうすればよいですか? – jduncanator

+0

Kevinによって与えられたこの2つの例では、サブシェルを使用しません;) –

1

内容はこれだけ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

ちょうどかっこを削除し、それはあなたが欲しいものを行う必要があります。

カッコは、コンテンツを別のシェルスクリプトに入れることに相当します。exitはそのシェルスクリプトを終了します。

0

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

から括弧の間に埋め込まれたコマンドリストはサブシェルとして実行されます。

(command1; command2; command3; ...) 

中括弧で囲まれたコードブロックはサブシェルを起動しません。

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

最初のケースでは、終了するサブシェルによって終了が実行され、起動するシェルに制御が戻されます。

関連する問題