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
test
…[[
azksh
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.echo
s parancsot? Számítottam volna rá hogy kilépjen az első után, és ne jusson tovább a másodikra.exit 1
utasítást. Valószínűleg később került hozzá.