Jsem zmatený ohledně významu výstupního kódu na konci bash skriptu: Vím, že výstupní kód 0 znamená, že byl úspěšně dokončen a že existuje mnohem více čísel ukončovacích kódů (127, pokud se nemýlím?)
Moje otázka se týká toho, když se na konci skriptu zobrazí ukončovací kód 0, ano vynutí výstupní kód jako 0, i když skript selhal, nebo má jiný význam?
Komentáře
Odpověď
Integrovaný příkaz exit
ukončí prostředí (z Bash reference ):
exit [n]
Ukončení prostředí s návratem stavu n rodiči shellu. Pokud je n vynecháno, stav ukončení je stav posledního provedeného příkazu. Jakákoli depeše na EXIT se provede před ukončením shellu.
Ukončí se také běh na konec souboru a vrátí návratový kód posledního příkazu, takže ano, poslední exit 0
způsobí, že skript bude ukončen s úspěšným stavem bez ohledu na stav ukončení předchozí příkazy. (To znamená za předpokladu, že skript dosáhne konečné exit
.) Na konci skriptu můžete také použít true
nebo k získání výstupního kódu s nulovou hodnotou.
Samozřejmě častěji používáte exit
zevnitř if
k ukončení skriptu uprostřed.
Ty by měly vytisknout 1 ($?
obsahuje návratový kód vrácený předchozím příkazem) :
sh -c "false" ; echo $? sh -c "false; exit" ; echo $?
I když by to mělo vytisknout 0:
sh -c "false; exit 0" ; echo $?
Já nejsem jistě, jestli má koncept „selhání“ skriptu při provádění exit
smysl, protože je docela možné, že některé příkazy spuštěné skriptem selžou, ale samotný skript uspět . Je na autorovi skriptu, aby rozhodl, co je úspěšné a co není.
Standardní rozsah výstupních kódů je také 0..255. Kódy nad 127 používá shell k označení procesu ukončeného signálem, ale lze je vrátit obvyklým způsobem. wait
systémové volání ve skutečnosti vrací širší hodnotu, zbytek obsahuje stavové bity nastavené operačním systémem.
Komentáře
- Super, ' nevím o číslování 8bitových výstupních kódů. Děkujeme!
- Upozorňujeme, že když je proces zabit, neukončí se s ukončovacím kódem > 127. ' pouze to, že některé skořápky v tom případě nastavily
$?
na 128 + signum. Podrobnosti najdete v části Výchozí kód ukončení po ukončení procesu? . -
exit 0
vrátí pouze 0, pokud je proveden výstup. (mohlo by odejít jinou cestou).
Odpověď
0 znamená úspěch, kladná celá čísla znamenají neúspěch. Existuje 255 různých chybových kódů, ale hodnoty 126 a vyšší jsou vyhrazeny, což znamená, že program nemohl spustit (126 nebo 127) nebo byl zabit signálem (129 a výše). Viz Výchozí ukončovací kód, když je proces ukončen? a Jaké návratové / výstupní hodnoty mohu použít v bash funkcích / skriptech? pro více informací.
Stav ukončení shellového skriptu je stavem ukončení posledního příkazu, který skript provedl. Takže například
#!/bin/sh somecommand
vrací stav ukončení somecommand
, zatímco
#!/bin/sh somecommand exit 0
vrací 0 bez ohledu na to, co somecommand
se vrátil.Tento druhý skript lze také napsat
#!/bin/sh somecommand true
Uvedení exit 0
na konec skriptu nemusí nutně způsobit vrátí se 0. Tím se vrátí pouze 0, když je dosaženo konce skriptu. Například následující skript vždy vrátí 3:
#!/bin/sh exit 3 exit 0
The následující skript také vždy vrátí chybový kód, kromě zobrazení zprávy o syntaktické chybě:
#!/bin/sh } exit 0
Následující skript vrací buď 1 nebo 0 v závislosti na jeho první argument:
#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0
Následující skript vrátí stav somecommand
, protože set -e
způsobí ukončení skriptu, pokud somecommand
selže:
#!/bin/sh set -e somecommand exit 0
exit 0
, bude ukončen s výstupním kódem 0 bez ohledu na to, co se děje ve skriptu.exit 0
, ukončí se s kódem 0, pouze pokud byla provedena poslední instrukce. Jediným dopademexit 0
na konci skriptu je vrátit 0 namísto stavu z předchozí instrukce.exit 0
, vrátí návratový kód 0 bez ohledu na to, co se před tím stalo.