Testuji různé věci v bash skriptování a narazil jsem na problém, že k němu nemohu získat vysvětlení.
Jsem záměrně psát špatný příkaz, získat výstupní kód odlišný od 0, ale nějak se zdá, že stále dostávám 0.
Kód, který provádím, je:
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}"
Výstup mého kódu je:
id: neznámá možnost – s
Zkuste „id –help“ pro více informací.
Váš příkaz se nepodařilo provést s ukončovacím kódem 0
Vaše uživatelské jméno je
Hádám, že nějakým způsobem zobrazuje výstupní kód příkazu echo? I když je výstupní kód 0, proč se zadává do příkazu if?
Pokud to tak je, jak to mohu udělat tak, aby zobrazovalo skutečný výstupní kód, který by se měl zobrazit?
Odpovědět
Ve vašem kódu je v rámci příkazu if
uveden stav opuštění tištěný je stav ukončení testu [[ ${?} -ne 0 ]]
. Hodnota $?
je vždy stav ukončení naposledy provedeného příkazu a test se počítá jako příkaz, alespoň s ohledem na nastavení hodnoty $?
k jeho výsledku.
Pokud chcete vytisknout stav ukončení id
, přiřaďte jej k proměnné, jejíž hodnota se nezmění,
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
test
…[[
je součástíksh
syntaxe a běží jako součást tlumočníka, ale ne jako vestavěný příkaz. Zdá se však, že tato část tlumočníka resetuje zapamatovaný výstupní kód.echo
s? Čekal bych to ukončit po prvním a nedojít do druhého.exit 1
. Pravděpodobně to bylo přidáno později.