Avslutningskode på slutten av et bash-skript

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

  • Hvis et skript slutter med exit 0, den vil gå ut med utgangskoden 0 uavhengig av hva som skjer i skriptet.
  • @Hatclock hvorfor ikke ' kan du ikke merke det, og jeg ' t tror du får falske internettpoeng for å svare (ikke sant?) Bare en tanke. .. (kudos for det raske svaret)
  • Jeg ' m på en togstasjon på telefonen min, jeg ikke liker ikke å skrive for mye på telefonen min. ilkkachu ser ut til å ha et godt svar skjønt!
  • @Hatclock Nei, ikke i det hele tatt. Hvis et skript slutter med exit 0, avsluttes det bare med koden 0 hvis den siste instruksjonen ble utført. Den eneste virkningen av exit 0 på slutten av skriptet er å returnere 0 i stedet for status fra forrige instruksjon.
  • @Gilles Det var mer tvetydig formulert svar fra min side. Hvis et skript kjører exit 0 når som helst, vil det returnere utgangskode 0 uavhengig av hva som har skjedd før det.

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 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *