Jeg er forvirret over betydningen af exit-koden i slutningen af et bash-script: Jeg kender den exit-kode 0 betyder, at det blev afsluttet med succes, og at der er mange flere udgangskodetal (127 hvis jeg ikke tager fejl?)
Mit spørgsmål handler om, når jeg ser udgangskode 0 i slutningen af et script, gør tvinger det udgangskoden som 0, selvom scriptet mislykkedes, eller har det en anden betydning?
Kommentarer
Svar
Den indbyggede kommando exit
forlader skallen (fra Bash “s reference ):
exit [n]
Afslut skallen, returner status n til shellens forælder. Hvis n udelades, er udgangsstatus den for den sidste kommando, der blev udført. Enhver fælde på EXIT udføres, før shell slutter.
Kører til slutningen af filen afsluttes også, returnerer returkoden for den sidste kommando, så ja, en endelig exit 0
gør scriptet til at afslutte med vellykket status uanset exitstatus for de foregående kommandoer. (Det vil sige forudsat at scriptet når den sidste exit
.) I slutningen af et script kan du også bruge true
eller for at få en udgangskode på nul.
Selvfølgelig ville du oftere bruge exit
indefra en if
for at afslutte scriptet i midten.
Disse skal udskrive en 1 ($?
indeholder udgangskoden returneret af den forrige kommando) :
sh -c "false" ; echo $? sh -c "false; exit" ; echo $?
Selvom dette skulle udskrive en 0:
sh -c "false; exit 0" ; echo $?
Jeg er ikke sikker på, om begrebet script “mislykkes” ved udførelse af en exit
giver mening, da det er meget muligt, at nogle kommandoer, der køres af scriptet, mislykkes, men selve scriptet lykkes . Det er op til forfatteren af scriptet at afgøre, hvad der er en succes, og hvad der ikke er.
Standardområdet for exitkoder er også 0..255. Koder over 127 bruges af skallen til at indikere en proces, der afsluttes med et signal, men de kan returneres på den sædvanlige måde. wait
systemopkald returnerer faktisk en bredere værdi, hvor resten indeholder statusbits indstillet af operativsystemet.
Kommentarer
- Sejt, jeg vidste ikke ' ikke om nummereringen på 8 bits udgangskoder. Tak!
- Bemærk, at når en proces dræbes, afslutter den ikke med en udgangskode > 127. Den ' s bare at nogle skaller indstiller
$?
til 128 + signum i så fald. Se Standardudgangskode, når processen afsluttes? for detaljer. -
exit 0
vender kun tilbage 0, hvis udgangen udføres. (det kan afslutte ad en anden rute).
Svar
0 betyder succes, positive heltal betyder fiasko. Der er 255 forskellige fejlkoder, men værdier 126 og derover er forbeholdt for at indikere, at et program ikke kunne starte (126 eller 127) eller blev dræbt af et signal (129 og derover). Se Standardudgangskode, når processen afsluttes? og Hvilke retur- / afslutningsværdier kan jeg bruge i bash-funktioner / scripts? for mere information.
Afslutningsstatus for et shell-script er udgangsstatus for den sidste kommando, som scriptet udførte. Så for eksempel
#!/bin/sh somecommand
returnerer udgangsstatus for somecommand
, mens
#!/bin/sh somecommand exit 0
returnerer 0 uanset hvad somecommand
vendte tilbage.Dette andet script kunne også skrives
#!/bin/sh somecommand true
At sætte exit 0
i slutningen af et script forårsager ikke nødvendigvis det at returnere 0. Dette får det kun til at returnere 0 når slutningen af scriptet er nået. F.eks. returnerer følgende script altid 3:
#!/bin/sh exit 3 exit 0
følgende script returnerer også altid en fejlkode ud over at vise en meddelelse om en syntaksfejl:
#!/bin/sh } exit 0
Følgende script returnerer enten 1 eller 0 afhængigt af dets første argument:
#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0
Følgende script returnerer status for somecommand
, da set -e
får scriptet til at afslutte, hvis somecommand
mislykkes:
#!/bin/sh set -e somecommand exit 0
exit 0
, den afgår med udgangskoden 0 uanset hvad der sker inden for scriptet.exit 0
, afsluttes det kun med koden 0, hvis den sidste instruktion blev udført. Den eneste indvirkning afexit 0
i slutningen af scriptet er at returnere 0 i stedet for status fra den tidligere instruktion.exit 0
på ethvert tidspunkt, returnerer det exitkode 0 uanset hvad der er sket forud for det.