Jeg tester forskjellige ting i bash scripting og jeg kom inn i et problem som jeg ikke kan få en forklaring på.
Jeg er med vilje skrive en feil kommando, for å få en utgangskode som er forskjellig fra 0, men på en eller annen måte ser det ut til at jeg fortsatt får 0.
Koden jeg kjø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}"
Utgangen av koden min er:
id: ukjent alternativ – s
Prøv «id –help» for mer informasjon.
Kommandoen din ble ikke utført med utgangskode 0
Brukernavnet ditt er
Jeg gjetter at det på en eller annen måte viser utgangskoden for ekkokommandoen? Likevel, hvis utgangskoden er 0, hvorfor angir den i if-setningen?
Hvis det er tingen, hvordan kan jeg gjøre det for å vise den faktiske utgangskoden som skal vises?
Svar
I koden din, i if
-uttalelsen, utgangsstatusen som får trykt er utgangsstatus for testen [[ ${?} -ne 0 ]]
. Verdien $?
er alltid utgangsstatus for den sist utførte kommandoen, og testen teller som en kommando, i det minste med hensyn til å sette verdien til $?
til resultatet.
Hvis du vil skrive ut utgangsstatus for id
, tilordner du den til en variabel hvis verdien ikke endres,
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
test
…[[
er en del avksh
syntaksen og kjører som en del av tolken, men ikke som en innebygd Det ser imidlertid ut til at denne delen av tolken tilbakestiller den huskede utgangskoden.echo
s? Jeg hadde forventet det for å avslutte etter den første, og ikke komme til den andre.exit 1
uttalelsen i den. Det ble sannsynligvis lagt til senere.