Utgångskod i slutet av ett bash-skript

Jag är förvirrad över innebörden av utgångskoden i slutet av ett bash-skript: Jag vet att utgångskoden 0 betyder att det slutfördes framgångsrikt och att det finns många fler utgångskodnummer (127 om jag inte tar fel?)

Min fråga handlar om när jag ser utgångskod 0 i slutet av ett skript, gör tvingar den utgångskoden som 0 även om skriptet misslyckades eller har det en annan betydelse?

Kommentarer

  • Om ett skript slutar med exit 0, det kommer att avslutas med utgångskoden 0 oavsett vad som händer i skriptet.
  • @Hatclock varför inte ' t du publicerar ditt svar ett fullständigt utlovat svar? som en kommentar kan jag inte markera det, och jag ' tror inte att du får falska internetpoäng för att svara (eller hur?) Bara en tanke. .. (kudos för det snabba svaret)
  • Jag ' m på en järnvägsstation på min telefon, jag don gillar inte att skriva för mycket på min telefon. ilkkachu verkar dock ha ett bra svar!
  • @Hatclock Nej, inte alls. Om ett skript slutar med exit 0 avslutas det med koden 0 endast om den senaste instruktionen utfördes. Den enda effekten av exit 0 i slutet av skriptet är att returnera 0 istället för status från föregående instruktion.
  • @Gilles Det var mer tvetydigt formulerat svar från min sida. Om ett skript kör exit 0 när som helst kommer det att returnera utgångskod 0 oavsett vad som har hänt innan det.

Svar

Det inbyggda kommandot exit lämnar skalet (från Bash ”s referens ):

exit [n]
Avsluta skalet och returnera statusen n till skalets förälder. Om n utelämnas är utgångsstatusen för det senast utförda kommandot. Alla fällor på EXIT körs innan skalet avslutas.

Att köra till slutet av filen avslutas också, returnera returkoden för det sista kommandot, så ja, en sista exit 0 gör att skriptet avslutas med framgångsrik status oavsett utgångsstatus för föregående kommandon. (Det vill säga förutsatt att skriptet når den sista exit.) I slutet av ett skript kan du också använda true eller för att få en utgångskod på noll.

Naturligtvis använder du exit naturligtvis inifrån en if för att avsluta skriptet i mitten.

Dessa ska skriva ut en 1 ($? innehåller utgångskoden som returneras av föregående kommando) :

sh -c "false" ; echo $? sh -c "false; exit" ; echo $? 

Även om detta ska skriva ut ett 0:

sh -c "false; exit 0" ; echo $? 

Jag är inte säker på att begreppet skript ”misslyckas” vid körning av en exit är vettigt, eftersom det är möjligt att vissa kommandon som körs av skriptet misslyckas, men själva skriptet lyckas . Det är upp till skribentens författare att avgöra vad som är framgång och vad som inte är.

Standardutbudet för utgångskoder är också 0..255. Koder över 127 används av skalet för att indikera en process som avslutas av en signal, men de kan returneras på vanligt sätt. Systemanropet wait returnerar faktiskt ett bredare värde, medan resten innehåller statusbitar som ställts in av operativsystemet.

Kommentarer

  • Cool, jag visste inte ' om de 8 bitars utgångskodsnumreringen. Tack!
  • Observera att när en process dödas avslutas den inte med en utgångskod > 127. Den ' s bara att vissa skal sätter $? till 128 + signum i så fall. Se Standardutgångskod när processen avslutas? för mer information.
  • exit 0 återkommer bara 0, om utgången körs. (det kan gå ut på en annan väg).

Svar

0 betyder framgång, positiva heltal betyder misslyckande. Det finns 255 olika felkoder, men värdena 126 och högre är reserverade för att indikera att ett program inte kunde starta (126 eller 127) eller dödades av en signal (129 och högre). Se Standardutgångskod när processen avslutas? och Vilka retur- / utgångsvärden kan jag använda i bash-funktioner / skript? för mer information.

Utgångsstatus för ett skalskript är utgångsstatus för det sista kommandot som skriptet utförde. Så till exempel

#!/bin/sh somecommand 

returnerar utgångsstatus för somecommand, medan

#!/bin/sh somecommand exit 0 

returnerar 0 oavsett vad somecommand återvände.Det andra skriptet kan också skrivas

#!/bin/sh somecommand true 

Att sätta exit 0 i slutet av ett skript orsakar inte nödvändigtvis det för att returnera 0. Detta gör att det bara returnerar 0 när man når slutet på skriptet. Till exempel returnerar följande skript alltid 3:

#!/bin/sh exit 3 exit 0 

följande skript returnerar också alltid en felkod förutom att visa ett meddelande om ett syntaxfel:

#!/bin/sh } exit 0 

Följande skript returnerar antingen 1 eller 0 beroende på dess första argumentet:

#!/bin/sh if [ "$1" = "foo" ]; then exit 1 fi exit 0 

Följande skript returnerar statusen för somecommand, eftersom set -e gör att skriptet avslutas om somecommand misslyckas:

#!/bin/sh set -e somecommand exit 0 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *