Ik ben verschillende dingen aan het testen in bash-scripting en ik kwam op een probleem terecht dat ik er geen verklaring voor kan krijgen.

Ik ben met opzet een verkeerd commando schrijven om een exitcode te krijgen die verschilt van 0, maar op de een of andere manier lijkt het erop dat ik nog steeds 0 krijg.

De code die ik uitvoer is:

USER_NAME=$(id -uns) if [[ ${?} -ne 0 ]] then echo "Your command failed to execute with exit code ${?}" exit 1 fi echo "Your username is ${USER_NAME}" 

De output van mijn code is:

id: onbekende optie – s

Probeer “id –help” voor meer informatie.

Uw opdracht kon niet worden uitgevoerd met afsluitcode 0

Uw gebruikersnaam is

Ik vermoed dat het op de een of andere manier de exitcode voor het echo-commando weergeeft? Maar als de exitcode 0 is, waarom wordt het dan in het if-statement ingevoerd?

Als dat het “is, hoe kan ik er dan voor zorgen dat de daadwerkelijke exitcode wordt weergegeven die moet worden weergegeven?

Antwoord

In uw code, binnen de if -instructie, de exitstatus die krijgt afgedrukt is de afsluitstatus van de test [[ ${?} -ne 0 ]]. De waarde $? is altijd de exit-status van de meest recent uitgevoerde opdracht, en de test telt als een opdracht, althans wat betreft het instellen van de waarde van $? aan het resultaat.

Als u de afsluitstatus van id wilt afdrukken, wijs deze dan toe aan een variabele waarvan de waarde niet zal veranderen,

id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi 

Reacties

  • Dit niet-POSIX-script voert … [[ maakt deel uit van de ksh syntaxis en wordt uitgevoerd als onderdeel van de interpreter, maar niet als een ingebouwde commando. Het lijkt er echter op dat dit deel van de interpreter de onthouden exitcode reset.
  • Waarom voert het script echter beide echo s uit? Ik had het verwacht om na de eerste af te sluiten en de tweede niet te halen.
  • @pericynthion Ze tonen niet de code die ze daadwerkelijk hebben uitgevoerd. De uitvoer die ze laten zien komt van een versie van hun code zonder de exit 1 instructie erin. Het is waarschijnlijk later toegevoegd.

Geef een reactie

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