2013-11-10 15 views
6

Oto proste pytanie. Dlaczego tego nie zachowują się tak, myślę, że będzie:`exit` wewnątrz nawiasów nie wychodzi ze skryptu

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

... lub ...

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

Uruchomienie jednego z tych dwóch fragmentów spowoduje wykonanie skryptu ustawicznego mimo wyraźnego polecenia exit .

Oczywiście nawiasy mają wpływ na polecenie z jakiegoś powodu, moje pytanie brzmi: dlaczego?

Odpowiedz

7

Nawiasy wykonują swoją zawartość w podpowłoce, dlatego jest to podpora, która kończy.

Zazwyczaj można osiągnąć ten sam efekt z innym && lub przy użyciu {} zamiast ().

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

Albo

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

Jak można zrobić powyższe bez używania "podpowłoki"? – jduncanator

+0

Z tymi dwoma przykładami podanymi przez Kevina, nie użyjesz podpowłok;) –

1

Zawartość (...) są wykonywane w podpowłoce, więc po prostu exit to powłoka. Podejście to powinno działać lepiej dla Ciebie i jest łatwiejsze do odczytania utrzymać do następnej osoby, aby przyjść i otwórz skrypt:

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

prostu usuń nawiasy i powinien robić to, co chcesz.

Nawiasy są równoważne umieszczeniu ich zawartości w innym skrypcie powłoki, gdzie exit właśnie kończy ten skrypt powłoki.

0

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

listę poleceń wbudowaną w nawiasach działa jako podpowłoce.

(command1; command2; command3; ...) 

Blok kodu pomiędzy nawiasami klamrowymi nie uruchamia podpowłok.

W pierwszym przypadku wyjście jest uruchamiane przez powłokę dodatkową, która kończy działanie i zwraca kontrolę do powłoki wywołującej.