Ik ben verschillende dingen aan het testen in bash-scripting en ik kwam op een probleem terecht dat ik er geen verklaring voor kan krijgen.
Ik ben met opzet een verkeerd commando schrijven om een exitcode te krijgen die verschilt van 0, maar op de een of andere manier lijkt het erop dat ik nog steeds 0 krijg.
De code die ik uitvoer is:
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}"
De output van mijn code is:
id: onbekende optie – s
Probeer “id –help” voor meer informatie.
Uw opdracht kon niet worden uitgevoerd met afsluitcode 0
Uw gebruikersnaam is
Ik vermoed dat het op de een of andere manier de exitcode voor het echo-commando weergeeft? Maar als de exitcode 0 is, waarom wordt het dan in het if-statement ingevoerd?
Als dat het “is, hoe kan ik er dan voor zorgen dat de daadwerkelijke exitcode wordt weergegeven die moet worden weergegeven?
Antwoord
In uw code, binnen de if
-instructie, de exitstatus die krijgt afgedrukt is de afsluitstatus van de test [[ ${?} -ne 0 ]]
. De waarde $?
is altijd de exit-status van de meest recent uitgevoerde opdracht, en de test telt als een opdracht, althans wat betreft het instellen van de waarde van $?
aan het resultaat.
Als u de afsluitstatus van id
wilt afdrukken, wijs deze dan toe aan een variabele waarvan de waarde niet zal veranderen,
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
[[
maakt deel uit van deksh
syntaxis en wordt uitgevoerd als onderdeel van de interpreter, maar niet als een ingebouwde commando. Het lijkt er echter op dat dit deel van de interpreter de onthouden exitcode reset.echo
s uit? Ik had het verwacht om na de eerste af te sluiten en de tweede niet te halen.exit 1
instructie erin. Het is waarschijnlijk later toegevoegd.