Jeg tester forskellige ting i bash scripting, og jeg kom ind i et problem, som jeg ikke kan få en forklaring på.

Jeg er med vilje skrive en forkert kommando for at få en udgangskode, der er forskellig fra 0, men på en eller anden måde ser det ud til, at jeg stadig får 0.

Koden jeg udfører er:

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}" 

Output af min kode er:

id: ukendt mulighed – s

Prøv “id –help” for at få flere oplysninger.

Din kommando kunne ikke udføres med exit kode 0

Dit brugernavn er

Jeg gætter på, at det på en eller anden måde viser udgangskoden for ekkokommandoen? Alligevel, hvis udgangskoden er 0, hvorfor indtastes den i if-sætningen?

Hvis det er sagen, hvordan kan jeg så få det til at vise den aktuelle udgangskode, der skal vises?

Svar

I din kode inden for if udsagnet, den exitstatus, der får udskrevet er testens udgangsstatus [[ ${?} -ne 0 ]]. Værdien $? er altid udgangsstatus for den senest udførte kommando, og testen tæller som en kommando, i det mindste med hensyn til indstilling af værdien for $? til dets resultat.

Hvis du vil udskrive exitstatus for id, skal du tildele den til en variabel, hvis værdi ikke ændres,

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

Kommentarer

  • Dette ikke-POSIX-script udfører ikke test[[ er en del af ksh syntaks og køres som en del af tolken, men ikke som en indbygget kommando. Det ser dog ud til, at denne del af tolken nulstiller den huskede udgangskode.
  • Hvorfor udfører scriptet dog begge echo s? Jeg ville have forventet det at afslutte efter den første og ikke komme til den anden.
  • @pericynthion De viser ikke koden, som de faktisk kørte. Det output, de viser, kommer fra en version af deres kode uden exit 1 udsagnet i den. Det blev sandsynligvis tilføjet senere.

Skriv et svar

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