Jeg er forvirret over betydningen av utgangskoden på slutten av et bash-skript: Jeg vet at utgangskoden 0 betyr at den ble fullført, og at det er mange flere utgangskodetall (127 hvis jeg ikke tar feil?)
Spørsmålet mitt handler om når jeg ser utgangskode 0 på slutten av et skript, gjør tvinger den utgangskoden som 0, selv om skriptet mislyktes, eller har det en annen betydning?
Kommentarer
Svar
Den innebygde kommandoen exit
går ut av skallet (fra Bash «s referanse ):
exit [n]
Gå ut av skallet, og returner statusen n til skallets overordnede. Hvis n er utelatt, er utgangsstatusen den for den siste kommandoen. Enhver felle på EXIT utføres før skallet avsluttes.
Kjører til slutten av filen går også ut, returnerer returkoden til den siste kommandoen, så ja, en endelig exit 0
vil gjøre at skriptet avsluttes med vellykket status uavhengig av utgangsstatus for de forrige kommandoene. (Det vil si forutsatt at skriptet når den endelige exit
.) På slutten av et skript kan du også bruke true
eller for å få en utgangskode på null.
Oftere bruker du selvfølgelig exit
fra innsiden av en if
for å avslutte skriptet i midten.
Disse skal skrive ut en 1 ($?
inneholder utgangskoden som ble returnert av forrige kommando) :
sh -c "false" ; echo $? sh -c "false; exit" ; echo $?
Selv om dette skal skrive ut en 0:
sh -c "false; exit 0" ; echo $?
Jeg er ikke sikker på om begrepet skript «mislykkes» når du kjører en exit
er fornuftig, da det er ganske mulig at noen kommandoer som kjøres av skriptet mislykkes, men selve skriptet lykkes . Det er opp til forfatteren av skriptet å bestemme hva som skal lykkes og hva som ikke er.
Standardområdet for utgangskoder er også 0..255. Koder over 127 brukes av skallet for å indikere en prosess avsluttet av et signal, men de kan returneres på vanlig måte. wait
systemanropet returnerer faktisk en bredere verdi, mens resten inneholder statusbiter satt av operativsystemet.
Kommentarer
- Kult, jeg visste ikke ' om 8-bits nummerering av utgangskoder. Takk!
- Merk at når en prosess blir drept, avslutter den ikke med en utgangskode > 127. Den ' s bare at noen skall setter
$?
til 128 + signum i så fall. Se Standard utgangskode når prosessen avsluttes? for detaljer. -
exit 0
kommer bare tilbake 0, hvis utgangen utføres. (det kan gå ut av en annen rute).
Svar
0 betyr suksess, positive heltall betyr feil. Det er 255 forskjellige feilkoder, men verdiene 126 og over er reservert for å indikere at et program ikke kunne starte (126 eller 127) eller ble drept av et signal (129 og over). Se Standard utgangskode når prosessen avsluttes? og Hvilke retur- / utgangsverdier kan jeg bruke i bash-funksjoner / skript? for mer informasjon.
Utgangsstatus for et skallskript er utgangsstatus for den siste kommandoen som skriptet utførte. Så for eksempel
#!/bin/sh somecommand
returnerer utgangsstatus for somecommand
, mens
#!/bin/sh somecommand exit 0
returnerer 0 uansett hva somecommand
returnerte.Dette andre skriptet kan også skrives
#!/bin/sh somecommand true
Å sette exit 0
på slutten av et skript ikke nødvendigvis forårsaker det for å returnere 0. Dette gjør at det bare returnerer 0 når slutten av skriptet er nådd. For eksempel returnerer følgende skript alltid 3:
#!/bin/sh exit 3 exit 0
følgende skript returnerer også alltid en feilkode, i tillegg til å vise en melding om en syntaksfeil:
#!/bin/sh } exit 0
Følgende skript returnerer enten 1 eller 0 avhengig av første argument:
#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0
Følgende skript returnerer statusen til somecommand
, siden set -e
får skriptet til å avslutte hvis somecommand
mislykkes:
#!/bin/sh set -e somecommand exit 0
exit 0
, den vil gå ut med utgangskoden 0 uavhengig av hva som skjer i skriptet.exit 0
, avsluttes det bare med koden 0 hvis den siste instruksjonen ble utført. Den eneste virkningen avexit 0
på slutten av skriptet er å returnere 0 i stedet for status fra forrige instruksjon.exit 0
når som helst, vil det returnere utgangskode 0 uavhengig av hva som har skjedd før det.