Jag testar olika saker i bash-skript och jag kom in i ett problem som jag inte kan få en förklaring till.
Jag är medvetet skriva ett felkommando för att få en utgångskod som skiljer sig från 0, men på något sätt verkar det som om jag fortfarande får 0.
Koden jag kör är:
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}"
Utgången från min kod är:
id: okänt alternativ – s
Försök ”id –help” för mer information.
Ditt kommando kunde inte utföras med utgångskod 0
Ditt användarnamn är
Jag antar att det på något sätt visar utgångskoden för ekokommandot? Trots det, om utgångskoden är 0, varför anger den i if-satsen?
Om det är så, hur kan jag göra det för att visa den faktiska utgångskoden som ska visas?
Svar
I din kod, inom if
uttalandet, utgångsstatusen som får tryckt är utgångsstatus för testet [[ ${?} -ne 0 ]]
. Värdet $?
är alltid utgångsstatus för det senast utförda kommandot, och testet räknas som ett kommando, åtminstone när det gäller att ställa in värdet för $?
till dess resultat.
Om du vill skriva ut utgångsstatus för id
, tilldela den till en variabel vars värde inte ändras,
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
test
…[[
är en del avksh
syntax och körs som en del av tolken, men inte som en inbyggd kommando. Det verkar dock som om den här delen av tolken återställer den ihågkomna utgångskoden.echo
? för att avsluta efter den första och inte göra den till den andra.exit 1
uttalande i den. Det lades antagligen till senare.