2010-03-31 13 views
19

Wyobraźmy Mam skrypt bash, gdzie nazywają to:Czy można uzyskać kod zakończenia z podpowłoki?

bash -c "some_command" 
do something with code of some_command here 

Czy to możliwe, aby uzyskać kod some_command? Nie wykonuję some_command bezpośrednio w powłoce z uruchomionym skryptem, ponieważ nie chcę zmieniać jego środowiska.

+0

Nie jestem pewien co do waszych powodów wykonywania pośrednio - że podpowłoki dziedziczą środowisko ze skryptu wywołującego. Po prostu wypróbuj 'export FOO =" foo "; bash -c 'echo $ FOO'' (pojedyncze cudzysłowy, więc nie jest rozwijane, dopóki nie uruchomi go podrzędna). – Cascabel

+2

Dziedziczy środowisko, ale nie zmieni środowiska dla bieżącej powłoki. Wszelkie modyfikacje dokona w env. vary znikną, gdy umrze. – Geo

+0

Jeśli chcesz uruchomić coś bez zbijania powłoki rodzica, użyłbym podpowłoki, http://tldp.org/LDP/abs/html/subshells.html – slm

Odpowiedz

22

$? będzie zawierać kod powrotu z some_command tak jak zwykle.

Oczywiście może również zawierać kod z bashu, na wypadek, gdyby coś poszło nie tak, zanim Twoje polecenie mogłoby zostać wykonane (niewłaściwa nazwa pliku, czegokolwiek).

6

Możesz użyć zmiennej $?, sprawdź dokumentację bash, aby zachować status wyjścia ostatniego polecenia.

Możesz również chcieć sprawdzić bloki poleceń typu bash (np. comm1 && (comm2 || comm3) && comm4), są one zawsze wykonywane w podpowłoce, nie zmieniając bieżącego środowiska i są również potężniejsze!

EDYCJA: Na przykład, przy użyciu bloków stylu() w porównaniu do polecenia "bash -c", nie trzeba się martwić o brakujące ciągi argumentów za pomocą spacji lub jakiejkolwiek innej specjalnej składni powłoki. Używasz bezpośrednio składni powłoki, jest to normalna część reszty kodu.

+3

Innymi słowy, '(some_command)' zamiast 'bash -c" some_command "' –

18

Oto ilustracja $? i nawias podpowłoki wspomniał Paggas i Matti:

$ (exit a); echo $? 
-bash: exit: a: numeric argument required 255 
$ (exit 33); echo $? 
33 

W pierwszym przypadku kod jest błąd atakujących i w drugim przypadku jest to kod wyjścia z exit.

+0

Nie masz na myśli '$ (...)', a nie '$ (...)'? Ta ostatnia jest nie tylko nieważna, ale także bardzo myląca. – Evi1M4chine

+4

@ Evi1M4chine: Znak dolara jest w tym przypadku znakiem zachęty. Nie powinno się pisać. Nagie nawiasy tworzą podpowłokę, jak wspomniano w mojej odpowiedzi i pozwalają uzyskać kod wyjścia, a nie wyjść z głównej powłoki. –

+1

Ah. Nadal sprawia kłopot. Nie twoja wina, że ​​standardowy monit jest taki sam jak wskaźnik zmiennej. :) – Evi1M4chine

Powiązane problemy