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 

Komentarze

  • Ten skrypt inny niż POSIX nie wykonuje test[[ jest częścią składni ksh i działa jako część interpretera, ale nie jako wbudowany Wydaje się jednak, że ta część interpretera resetuje zapamiętany kod zakończenia.
  • Dlaczego jednak skrypt wykonuje oba echo? Spodziewałbym się tego aby wyjść po pierwszym i nie przejść do drugiego.
  • @pericynthion Nie pokazują kodu, który faktycznie uruchomili. Dane wyjściowe, które pokazują, pochodzą z wersję ich kodu bez wyrażenia exit 1. Prawdopodobnie został dodany później.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *