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
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
exit 0
, det kommer att avslutas med utgångskoden 0 oavsett vad som händer i skriptet.exit 0
avslutas det med koden 0 endast om den senaste instruktionen utfördes. Den enda effekten avexit 0
i slutet av skriptet är att returnera 0 istället för status från föregående instruktion.exit 0
när som helst kommer det att returnera utgångskod 0 oavsett vad som har hänt innan det.