Ukončovací kód na konci bash skriptu

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

  • Pokud skript končí exit 0, bude ukončen s výstupním kódem 0 bez ohledu na to, co se děje ve skriptu.
  • @Hatclock proč ne ' Pokud svou odpověď zveřejníte jako slíbenou odpověď? Jako komentář ji nemůžu označit a nemyslím si, že ' získáte falešné internetové body za odpověď (správně?) Jen myšlenka. .. (sláva pro rychlou odpověď)
  • Jsem ' m na vlakovém nádraží v telefonu, se mi moc nelíbí psát na telefonu. Zdá se však, že ilkkachu má dobrou odpověď!
  • @Hatclock Ne, vůbec ne. Pokud skript končí exit 0, ukončí se s kódem 0, pouze pokud byla provedena poslední instrukce. Jediným dopadem exit 0 na konci skriptu je vrátit 0 namísto stavu z předchozí instrukce.
  • @Gilles To bylo spíše nejednoznačné formulovaná odpověď z mé strany. Pokud skript běží exit 0, vrátí návratový kód 0 bez ohledu na to, co se před tím stalo.

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 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *