Exit-code aan het einde van een bash-script

Ik ben in de war over de betekenis van de exit-code aan het einde van een bash-script: ik ken die exit-code 0 betekent dat het met succes is voltooid en dat er veel meer exitcodes zijn (127 als ik me niet vergis?)

Mijn vraag gaat over wanneer ik exitcode 0 aan het einde van een script zie, het forceert de afsluitcode als 0, zelfs als het script mislukt of heeft het een andere betekenis?

Reacties

  • Als een script eindigt met exit 0, het wordt afgesloten met de afsluitcode 0, ongeacht wat er in het script gebeurt.
  • @Hatclock waarom niet ' Plaats je je antwoord een volledig toegezegd antwoord? Als opmerking kan ik het niet markeren, en ik denk niet dat ' niet dat je nep-internetpunten krijgt om te antwoorden (toch?) Gewoon een gedachte. .. (complimenten voor het snelle antwoord)
  • Ik ' m op een treinstation op mijn telefoon, ik houd er niet van om teveel op mijn telefoon te typen. ilkkachu lijkt echter een goed antwoord te hebben!
  • @Hatclock Nee, helemaal niet. Als een script eindigt met exit 0, wordt het alleen afgesloten met de code 0 als die laatste instructie werd uitgevoerd. De enige impact van exit 0 aan het einde van het script is om 0 terug te geven in plaats van de status van de vorige instructie.
  • @Gilles Dat was meer dubbelzinnig antwoord van mijn kant. Als een script exit 0 op enig moment uitvoert, zal het exitcode 0 retourneren, ongeacht wat er daarvoor is gebeurd.

Antwoord

Het ingebouwde commando exit verlaat de shell (van Bash “s referentie ):

exit [n]
Verlaat de shell en retourneer de status n naar de ouder van de shell. Als n wordt weggelaten, is de exit-status die van het laatst uitgevoerde commando. Elke trap op EXIT wordt uitgevoerd voordat de shell wordt beëindigd.

Rennen naar het einde van het bestand wordt ook afgesloten en retourneert de retourcode van de laatste opdracht, dus ja, een laatste exit 0 zorgt ervoor dat het script wordt afgesloten met een succesvolle status, ongeacht de exitstatus de vorige commandos. (Dat wil zeggen, ervan uitgaande dat het script de laatste exit bereikt.) Aan het einde van een script zou je ook true kunnen gebruiken of om een exitcode van nul te krijgen.

Natuurlijk” gebruik je vaker exit vanuit een if om het script halverwege te beëindigen.

Deze zouden een 1 moeten afdrukken ($? bevat de afsluitcode die is geretourneerd door het vorige commando) :

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

Hoewel dit een 0 zou moeten afdrukken:

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

Ik “niet zeker als het concept van het script “faalt” bij het uitvoeren van een exit zinvol is, aangezien het heel goed mogelijk is dat sommige commandos die door het script worden uitgevoerd mislukken, maar het script zelf om te slagen . Het is aan de auteur van het script om te beslissen wat een succes is en wat niet.

Ook is het standaardbereik voor exitcodes 0..255. Codes boven 127 worden door de shell gebruikt om een proces aan te geven dat door een signaal wordt beëindigd, maar ze kunnen op de gebruikelijke manier worden geretourneerd. De wait systeemaanroep retourneert feitelijk een grotere waarde, terwijl de rest statusbits bevat die zijn ingesteld door het besturingssysteem.

Opmerkingen

  • Cool, ik wist ' niet van de 8 bits nummering van exitcodes. Bedankt!
  • Merk op dat wanneer een proces wordt beëindigd, het niet wordt afgesloten met een afsluitcode > 127. Het ' s alleen dat sommige shells in dat geval $? op 128 + signum zetten. Zie Standaard afsluitcode wanneer proces wordt beëindigd? voor details.
  • exit 0 keert alleen terug 0, als de exit wordt uitgevoerd. (het kan via een andere route worden verlaten).

Antwoord

0 betekent succes, positieve gehele getallen betekenen mislukking. Er zijn 255 verschillende foutcodes, maar waarden 126 en hoger zijn gereserveerd om aan te geven dat een programma “niet kon” starten (126 of 127) of werd gedood door een signaal (129 en hoger). Zie Standaard exitcode wanneer proces wordt beëindigd? en Welke return / exit-waarden kan ik gebruiken in bash-functies / scripts? voor meer informatie.

De exitstatus van een shellscript is de exitstatus van het laatste commando dat het script heeft uitgevoerd. Dus bijvoorbeeld

#!/bin/sh somecommand 

retourneert de exitstatus van somecommand, terwijl

#!/bin/sh somecommand exit 0 

0 retourneert ongeacht wat somecommand geretourneerd.Dit tweede script zou ook geschreven kunnen worden

#!/bin/sh somecommand true 

exit 0 aan het einde van een script plaatsen, veroorzaakt niet noodzakelijk het retourneert 0. Dit zorgt ervoor dat het alleen 0 retourneert als het einde van het script is bereikt. Het volgende script retourneert bijvoorbeeld altijd 3:

#!/bin/sh exit 3 exit 0 

De het volgende script retourneert ook altijd een foutcode, naast het weergeven van een bericht over een syntaxisfout:

#!/bin/sh } exit 0 

Het volgende script retourneert 1 of 0, afhankelijk van eerste argument:

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

Het volgende script retourneert de status van somecommand, sinds set -e zorgt ervoor dat het script wordt afgesloten als somecommand mislukt:

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *