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 

Kommentarer

  • Detta icke-POSIX-skript kör inte test[[ är en del av ksh 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.
  • Varför ändå kör skriptet båda echo? för att avsluta efter den första och inte göra den till den andra.
  • @pericynthion De visar inte koden som de faktiskt körde. Utdata som de visar kommer från en version av deras kod utan exit 1 uttalande i den. Det lades antagligen till senare.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *