Co je výstupní kód
Každý skript, příkaz nebo binární soubor končí s návratovým kódem. Tuto hodnotu můžete vidět ve speciální proměnné $? . Návratové kódy jsou číselné a jsou omezeny na 0-255, protože se používá 8bitové celé číslo bez znaménka. Pokud použijete hodnotu -1, vrátí 255. Každé provedení se ukončí ukončovacím kódem, ať už úspěšným nebo ne, s chybovou zprávou nebo tiše. Například:
$ date ; echo $? Sat Jan 18 08:06:07 IST 2020 0
Jak vidíte, ukončovací kód je 0, protože příkaz byl proveden bez problémů. Nyní zkusme toto:
$ wrngcmd ; echo $? -bash: wrngcmd: command not found 127
Je to příkaz, který nebyl nalezen, protože jsme právě napsali nesmyslnou hromadu znaků.
Rezervované výstupní kódy Bash
Podobně jako výstupní kód „0“, který označuje úspěch příkazu, má bash některé vyhrazené výstupní kódy pro různé situace. Pokud tedy ve skriptu používáte příkaz exit a potřebujete zadat kód ukončení, v ideálním případě nepoužívejte tyto vyhrazené kódy ukončení, protože mohou vytvářet konfliktní výsledky.
Číslo výstupního kódu | Význam | Příklad | Komentáře |
---|---|---|---|
1 | Chyba pro obecné chyby | nechte „var1 =1/0“ | Různé chyby, jako je „dělení nulou“ a další nepřípustné operace |
2 | Zneužití vestavěných prvků shellu | empty_function() {} | Chybí klíčové slovo nebo příkaz |
126 | Vyvolaný příkaz nelze provést | /dev/null | Problém s oprávněním nebo příkaz není spustitelný soubor |
127 | „příkaz nenalezen“ | ilegal_command | Možný problém s $PATH nebo překlep |
128 | Neplatný argument pro ukončení | výstup 3.14159 | exit trvá pouze celočíselné argumenty v rozsahu 0 – 255 (viz první poznámka pod čarou) |
128 +n | Signál závažné chyby „n“ | zničí -9 $PPID skriptu | $? vrátí 137 (128 + 9) |
130 | Skript ukončen pomocí Control-C | Ctrl-C | Control-C je kritický chybový signál 2, (130 =128 + 2, viz výše) |
255* | Stav ukončení mimo rozsah | výstup -1 | exit trvá pouze celočíselné argumenty v rozsahu 0 – 255 |
Pojďme pochopit výstupní kód „128 + n“ na příkladu. Spusťte nekonečnou smyčku, jak je ukázáno níže:
#!/bin/bash while true; do echo ${$} done
Pokud spustíte tento skript, bude tisknout stejné PID donekonečna, dokud jej nezabijete nebo neprovedete „CTRL+C“. Zkuste provést „CTRL+C“ a podívejte se, jaký je výstupní kód.
# sh test.sh .... 2582 2582 2582 2582 2582 2582 ^C geeklab$ echo $? 130
Jak můžete vidět, výstupní kód je „128+2“, tj. 130. Podobně, pokud skript zabijeme pomocí „kill -9“, výstupní kód by měl být „128+9“, tj. 137. Podívejme se také na příklad:
# sh test.sh .... 2582 2582 2582 ...
# kill -9 [pid_of_script]
.... 2602 2602 Killed: 9 geeklab$ echo $? 137