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 

Komentáře

  • Tento skript jiný než POSIX neprovádí 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.
  • Proč i když skript provádí oba echo s? Čekal bych to ukončit po prvním a nedojít do druhého.
  • @pericynthion Neukazují kód, který skutečně spustili. Výstup, který zobrazují, pochází z verze jejich kódu bez příkazu exit 1. Pravděpodobně to bylo přidáno později.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *