Mam skrypt bash, który prowadzi trzy kontrole nad moim kodu źródłowego, a następnie exit 0
jeśli wszystkie polecenia udało, albo exit 1
czy któryś z nich nie powiodło się:kody wyjścia Anding w bash
#!/bin/bash
test1 ./src/ --test-1=option
exit_1=$?
test2 ./src/ test-2-options
exit_2=$?
test3 ./src/ -t 3 -o options
exit_3=$?
# Exit with error if any of the above failed
[[ $exit_1 -eq 0 && $exit_2 -eq 0 && $exit_3 -eq 0 ]]
exit $?
Ten kod działa, ale wydaje się zbyt długie i pełne gadatliwości. Czy jest jakiś sposób, żeby to było przyjemniejsze? W szczególności nie jestem zadowolony z:
- konieczności uruchomienia polecenia, a następnie przypisać kod wyjścia do zmiennej
- konieczności korzystania
[[ ... ]]
, następnie zbierać jego kod wyjścia w następnej linii do wyjście z - Mając jawnie porównania zmiennych 0, jak w
[[ $var -eq 0 ]]
, zamiast traktowania ich jako wartości logiczne
idealnie, koniec wynik Wou ld być coś bardziej czytelne jak:
exit_1=(test1 ./src/ --test-1=option)
exit_2=(test2 ./src/ test-2-options)
exit_3=(test3 ./src/ -t 3 -o options)
# Exit with error if any of the above failed
exit ($exit_1 && $exit_2 && $exit_3)
pewne rzeczy mam wziąć pod uwagę:
Uzyskiwanie kod błędu w zmiennej w jednym wierszu:
exit_1=$(test1 ./src/ --test-1=option)$?
exit_2=$(test2 ./src/ test-2-options)$?
exit_3=$(test3 ./src/ -t 3 -o options)$?
to działa i sprawia, że jest to trochę krótsze, ale nigdy wcześniej nie widziałem, żeby ktoś z tego korzystał. Czy jest to rozsądne/rozsądne zachowanie? Czy są jakieś problemy z tym?
Wystarczy uruchomione testy i & & je razem:
test1 ./src/ --test-1=option && \
test2 ./src/ test-2-options && \
test3 ./src/ -t 3 -o options
status=$?
to robi nie pracy, jak zwarć bash. Jeśli nie powiedzie się test1
, test2 i test3 nie działają i chcę, aby wszystkie z nich działały.
Detecing błędy i wychodzenia z użyciem || exit
[[ $exit_1 -eq 0 && $exit_2 -eq 0 && $exit_3 -eq 0 ]] || exit 1
Oszczędza to jeden wiersz niewygodnych kodów wyjścia i zmiennych, ale ważne trochę exit 1
jest teraz w prawo na końcu linii, gdzie może tego nie zauważyć. Idealnie coś jak to będzie działać:
exit [[ $exit_1 -eq 0 && $exit_2 -eq 0 && $exit_3 -eq 0 ]]
Oczywiście, to nie robi pracy, jak [[
zwraca jego wyjście zamiast odbijając go.
exit $([[ $exit_1 -eq 0 && $exit_2 -eq 0 && $exit_3 -eq 0 ]] ; echo $?)
robi pracy, ale wciąż wydaje się okropny cludge
nie zostały wyraźnie do czynienia z wyjściem kodów-as-logicznych
[[ $exit_1 && $exit_2 && $exit_3 ]]
nie robić co miałbyś nadzieję, że to zrobi. Najprostszym sposobem połączenia trzech kodów zwrotnych przechowywanych w zmiennych jest pełna wersja & z pełną wersją &. Z pewnością jest lepszy sposób?
wiem bash nie jest ładny język programowania - jeśli można nawet nazwać - ale czy jest jakiś sposób mogę zrobić to mniej niezręcznie?
Metoda 'var = $ (foo) $?' Jest interesująca, ale powoduje, że twoje wywołania testowe są niepotrzebne. – kojiro
Co najmniej, twoje ostatnie 'exit $?' Nie jest konieczne, jeśli '[[... && ... && ... && ...]]' jest ostatnią instrukcją skryptu. – chepner