Afslut kode i slutningen af et bash-script

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

  • Hvis et script slutter med exit 0, den afgår med udgangskoden 0 uanset hvad der sker inden for scriptet.
  • @Hatclock hvorfor ' kan du ikke markere det, og jeg ' tror jeg ikke, du får falske internetpoint til at svare (ikke?) Bare en tanke. .. (kudos til det hurtige svar)
  • Jeg ' m på en togstation på min telefon, jeg don kan ikke lide at skrive for meget på min telefon. ilkkachu synes dog at have et godt svar!
  • @Hatclock Nej, slet ikke. Hvis et script slutter med exit 0, afsluttes det kun med koden 0, hvis den sidste instruktion blev udført. Den eneste indvirkning af exit 0 i slutningen af scriptet er at returnere 0 i stedet for status fra den tidligere instruktion.
  • @Gilles Det var mere tvetydigt formuleret svar fra min side. Hvis et script kører exit 0 på ethvert tidspunkt, returnerer det exitkode 0 uanset hvad der er sket forud for det.

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 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *