Uczę się, jak efektywnie korzystać z różnych set
opcji w moim skrypcie i natknąłem się na to, set -u
że wydaje się idealny do wychodzenia ze skryptu, jeśli zmienna nie zostanie poprawnie ustawiona (np. Usuwanie użytkowników). Według mężczyzny stronie, set -u
i set -e
robi, co następuje ...
-e Exit immediately if a command exits with a non-zero status.
-u Treat unset variables as an error when substituting.
Utworzyłem skrypt testowy, aby przetestować tę funkcjonalność, ale wydaje się, że nie działa zgodnie z oczekiwaniami. Być może ktoś mógłby mi lepiej wyjaśnić mój problem i gdzie źle interpretuję? Skrypt testowy znajduje się poniżej. Dziękuję Ci.
set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}
Oczekuję, że skrypt wyświetli 0 i „To działa” , a następnie zakończy się niepowodzeniem, ponieważ ${testing2}
nie jest ustawiony.
Zamiast tego wyświetla się 0 i „To działa” , następnie 0, a następnie 0 To nie powinno się pojawić
Czy ktoś może podać trochę wiedzy? Dziękuję Ci.
źródło
Odpowiedzi:
Z „man Bash”:
Kiedy to robisz
testing2=
, ustawiasz zmienną na ciąg pusty.Zmień to na
unset testing2
i spróbuj ponownie.W
set -e
tym przypadku nie pomaga, ponieważ przypisanie nigdy nie ma kodu wyjścia 1. Spróbuj tego, aby zobaczyć, że ostatnie wykonane polecenie (przypisanie) ma kod wyjścia 0, lub przeczytaj to pytanie :I wierzę również, że użycie zestawu -e jest bardziej problemem niż rozwiązaniem.
Błąd, który może wystąpić przy użyciu nieuzbrojonych zmiennych, to
set -u
:Wyjdzie:
źródło
testing2=
ustawiatesting2
zmienną na pusty ciąg; zmienna faktycznie jest ustawiona .Jednak jeśli miałbyś działać
echo $testing99
w interaktywnej powłoce Bash (bez ustawianiaerrexit
, tj.set -e
), Pojawiłby się błąd:Na bok
Podczas testowania skryptów właśnie odkryłem, że powłoka interaktywna nie zawsze kończy działanie, gdy próbuje rozwinąć zmienną, która nie została ustawiona, podczas gdy powłoka nieinteraktywna (uruchamiająca skrypt powłoki) zawsze wychodzi . Według strony podręcznika POSIX dla
set
:Interaktywna powłoka Bash nie zostanie zakończona, chyba że
errexit
została również ustawiona. Z drugiej strony interaktywna powłoka deski rozdzielczej nie zostanie zamknięta - nawet jeśliset -e
wcześniej była uruchomiona.źródło