Mam to w skrypcie bash:
exit 3;
exit_code="$?"
if [[ "$exit_code" != "0" ]]; then
echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
exit "$exit_code";
fi
Wygląda na to, że zakończy działanie zaraz po poleceniu wyjścia, co ma sens. Zastanawiałem się, czy istnieje jakieś proste polecenie, które może dostarczyć kod wyjścia bez wychodzenia od razu?
Miałem zgadywać:
exec exit 3
ale daje komunikat o błędzie: exec: exit: not found
. Co mogę zrobić? :)
bash
shell-script
exec
exit
exit-status
G-Man mówi „Przywróć Monikę”
źródło
źródło
exec exit 3
nie ma bueno, rozumiem"exec: exit: not found"
exit_code=3
iexit 3
całkowicie wyeliminować linię?$?
zmienną, ale nie wychodzi z tego skryptu?Odpowiedzi:
Jeśli masz skrypt, który uruchamia jakiś program i sprawdza status wyjścia programu (z
$?
), i chcesz przetestować ten skrypt, robiąc coś , co powoduje$?
ustawienie pewnej znanej wartości (np.3
), Po prostu zróbNawiasy tworzą pod-powłokę. Następnie
exit
polecenie powoduje zamknięcie podpowłoki z określonym statusem wyjścia.źródło
exit_code="3"
do testowaniaexit
jest wbudowany w bash, więc nie możesz tegoexec
zrobić. Per instrukcji atakujących za :Podsumowując, powiedziałbym, że jedyną opcją jest przechowywanie pożądanego statusu wyjścia w zmiennej, a następnie,
exit $MY_EXIT_STATUS
gdy jest to właściwe.źródło
$?
(choć nie jestem do końca pewien, dlaczego), wydaje się to solidną odpowiedzią. Jeśli chcesz tylko ustawić na nieudaną wartość,false
jest inną opcją.Możesz napisać funkcję, która zwraca status podany jako argument lub
255
jeśli nie podano żadnego. (Nazywam to,ret
ponieważ „zwraca” swoją wartość).i użyj
ret
zamiast twojego połączenia zexit
. Pozwala to uniknąć nieefektywności tworzenia podpowłoki w obecnie akceptowanej odpowiedzi.Niektóre pomiary.
na moim komputerze zajmuje około 3,5 sekundy.
na mojej maszynie zajmuje około 0,051 sekundy, 70 razy szybciej. Ustawienie domyślnej obsługi wciąż pozostawia ją 60 razy szybciej. Oczywiście pętla ma pewne narzuty. Jeśli zmienię ciało pętli na po prostu
:
lubtrue
wtedy czas zostanie zmniejszony o połowę do 0,025, całkowicie pusta pętla jest niepoprawną składnią. Dodanie;:
do pętli pokazuje, że to minimalne polecenie zajmuje 0,007 sekundy, więc narzut pętli wynosi około 0,018. Odjęcie tego narzutu od dwóch testów pokazuje, żeret
rozwiązanie jest ponad 100 razy szybsze.Oczywiście jest to syntetyczny pomiar, ale wszystko się sumuje. Jeśli sprawisz, że wszystko będzie 100 razy wolniejsze, niż jest to konieczne, otrzymasz wolne systemy. 0,0
źródło
O
exec exit 3
… próbowałby uruchomić zewnętrzną komendę o nazwieexit
, ale jej nie ma, więc pojawia się błąd. Musi to być polecenie zewnętrzne zamiast wbudowanego w powłokę, ponieważ całkowicieexec
zastępuje powłokę. Co oznacza również, że nawet gdyby wywołano zewnętrzne polecenieexit
,exec exit 3
nie wróci, aby kontynuować skrypt powłoki, ponieważ powłoki już nie będzie .źródło
exec bash -c "exit 3"
, ale w tej chwili nie mogę wymyślić żadnego powodu, aby to zrobić, a nie tylkoexit 3
.exec
'ing lub justingexit
' zatrzyma skrypt, co nie wyglądało tak, jak chciałoby to pytanie.Możesz to zrobić za pomocą Awk:
Lub Sed:
źródło
sh -c 'exit 9'
(exit 9)
w przyjętej odpowiedzi