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 0vrá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 0na 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.