Testez diferite lucruri în scriptarea bash și am intrat într-o problemă că nu pot obține o explicație pentru aceasta.
Sunt scriind în mod intenționat o comandă greșită, pentru a obține un cod de ieșire diferit de 0, dar cumva se pare că mai primesc 0.
Codul pe care îl execut eu este:
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}"
Ieșirea codului meu este:
id: opțiune necunoscută – s
Încercați „id –help” pentru mai multe informații.
Comanda dvs. nu a reușit să se execute cu codul de ieșire 0
Numele dvs. de utilizator este
Presupun că, într-un fel, afișează codul de ieșire pentru comanda echo? Chiar și așa, dacă codul de ieșire este 0, de ce intră în instrucțiunea if?
Dacă acesta este lucrul, atunci cum îl pot face să afișez codul de ieșire care ar trebui să fie afișat?
Răspuns
În codul dvs., în instrucțiunea if
, starea de ieșire care primește tipărit este starea de ieșire a testului [[ ${?} -ne 0 ]]
. Valoarea $?
este întotdeauna starea de ieșire a celei mai recente comenzi executate, iar testul contează ca o comandă, cel puțin în ceea ce privește setarea valorii $?
la rezultatul său.
Dacă doriți să imprimați starea de ieșire a id
, atribuiți-o unei variabile a cărei valoare nu va fi modificată,
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
test
…[[
face parte din sintaxaksh
și rulează ca parte a interpretului, dar nu ca un program încorporat comanda. Se pare însă că această parte a interpretului resetează codul de ieșire amintit.echo
s? M-aș fi așteptat pentru a ieși după primul și a nu ajunge la al doilea.exit 1
. Probabil a fost adăugat mai târziu.