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 

Comentarii

  • Acest script non-POSIX nu execută test[[ face parte din sintaxa ksh ș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.
  • De ce, deși scriptul execută ambele echo s? M-aș fi așteptat pentru a ieși după primul și a nu ajunge la al doilea.
  • @pericynthion Nu afișează codul pe care l-au rulat de fapt. Ieșirea din care arată arată o versiune a codului lor fără declarația exit 1. Probabil a fost adăugat mai târziu.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *