Különböző dolgokat tesztelek a bash szkriptekben, és olyan problémába ütköztem, hogy nem tudok magyarázatot adni rá.

szándékosan rossz parancs írása, a 0-tól eltérő kilépési kód megszerzése érdekében, de valahogy úgy tűnik, hogy mégis 0-t kapok.

A kód, amelyet “végrehajtok”:

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}" 

A kódom kimenete:

id: ismeretlen opció – s

Próbálja “id –help” további információkért.

A parancsot nem sikerült végrehajtani 0 kilépési kóddal.

A felhasználónév

Arra gondolok, hogy valamilyen módon megjeleníti az echo parancs kilépési kódját? Még akkor is, ha a kilépési kód 0, miért írja be az if utasítást?

Ha ez a dolog, akkor hogyan tudom elérni, hogy megjelenjen a megjelenítendő tényleges kilépési kód?

Válasz

A kódodban a if utasításban a kilépési állapot nyomtatott a teszt kilépési állapota [[ ${?} -ne 0 ]]. Az $? érték mindig a legutóbb végrehajtott parancs kilépési állapota, és a teszt parancsként számít, legalábbis ami a az eredményéhez.

Ha ki szeretné nyomtatni a id kimeneti állapotát, rendelje hozzá egy olyan változóhoz, amelynek értéke nem változik,

id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi 

Megjegyzések

  • Ez a nem POSIX parancsfájl nem hajtja végre a következőt: test[[ az ksh szintaxis része, és az értelmező részeként fut, de nem beépítettként parancs. Úgy tűnik azonban, hogy az értelmező ezen része visszaállítja az emlékezett kilépési kódot.
  • Miért hajtja végre a szkript mindkét echo s parancsot? Számítottam volna rá hogy kilépjen az első után, és ne jusson tovább a másodikra.
  • @pericynthion Nem azt a kódot mutatják, amelyet valójában futtattak. Az általuk mutatott kimenet származik kódjuk olyan változata, amely nem tartalmazza a exit 1 utasítást. Valószínűleg később került hozzá.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük