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
test
…[[
er en del afksh
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.echo
s? Jeg ville have forventet det at afslutte efter den første og ikke komme til den anden.exit 1
udsagnet i den. Det blev sandsynligvis tilføjet senere.