Testuję różne rzeczy w skryptach bash i napotkałem problem, którego nie mogę znaleźć wyjaśnienia.
Jestem celowo piszę niewłaściwe polecenie, aby uzyskać kod zakończenia inny niż 0, ale wydaje się, że nadal otrzymuję 0.
Kod, który wykonuję, to:
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}"
Wynik mojego kodu to:
id: nieznana opcja – s
Spróbuj „id –help”, aby uzyskać więcej informacji.
Twoje polecenie nie zostało wykonane z kodem zakończenia 0
Twoja nazwa użytkownika to
Zgaduję, że w jakiś sposób wyświetla kod zakończenia dla polecenia echo? Mimo to, jeśli kod zakończenia ma wartość 0, dlaczego pojawia się w instrukcji if?
Jeśli o to chodzi, to jak mogę sprawić, by wyświetlił się rzeczywisty kod zakończenia, który powinien zostać wyświetlony?
Odpowiedź
W kodzie, w instrukcji if
, status wyjścia, który otrzymuje wydrukowany to kod zakończenia testu [[ ${?} -ne 0 ]]
. Wartość $?
jest zawsze kodem zakończenia ostatnio wykonanego polecenia, a test liczy się jako polecenie, przynajmniej w odniesieniu do ustawienia wartości $?
do jego wyniku.
Jeśli chcesz wydrukować kod zakończenia id
, przypisz go do zmiennej, której wartość nie ulegnie zmianie,
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
test
…[[
jest częścią składniksh
i działa jako część interpretera, ale nie jako wbudowany Wydaje się jednak, że ta część interpretera resetuje zapamiętany kod zakończenia.echo
? Spodziewałbym się tego aby wyjść po pierwszym i nie przejść do drugiego.exit 1
. Prawdopodobnie został dodany później.