Czy jest jakiś sposób, aby sprawdzić, czy wystąpił błąd podczas wykonywania polecenia?
Przykład:
test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1
function valid () {
if $test -eq 1; then
echo "OK"
else echo "ERROR"
fi
}
Próbowałem już to zrobić, ale wygląda na to, że to nie działa. Nie wiem jak to zrobić.
command-line
moata_u
źródło
źródło
valid
) przed jej wywołaniem.Odpowiedzi:
Zwracana wartość jest przechowywana w
$?
. 0 oznacza sukces, inne oznaczają błąd.Jak każda inna wartość tekstowa, możesz przechowywać ją w zmiennej do przyszłego porównania:
Dla możliwych operatorów porównania, patrz
man test
.źródło
;
przedelse
ifi
: `if ...; następnie ...; inaczej ...; fitest
.[ $? ]
(lub równoważnietest $?
) nie działa, ponieważ zwraca$?
liczbę (0, 1 itd.), Która nie jest równa null. Zapoznaj się z dokumentacjątest
: „Jeśli WYRAŻENIE zostanie pominięte,„ test ”zwróci fałsz. Jeśli WYRAŻENIE jest pojedynczym argumentem,„ test ”zwróci fałsz, jeśli argument jest pusty, a prawda w przeciwnym razie.”Jeśli potrzebujesz tylko wiedzieć, czy polecenie zakończyło się powodzeniem, czy nie, nie zawracaj sobie głowy testowaniem
$?
, po prostu przetestuj polecenie bezpośrednio. Na przykład:A przypisanie wyniku do zmiennej nie zmienia wartości zwracanej (cóż, chyba że zachowuje się inaczej, gdy standardowe wyjście nie jest oczywiście terminalem).
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals wyjaśnia
if
bardziej szczegółowo.źródło
$?
robi to, więc nie masz racji twierdząc, że bezpośrednie testowanie polecenia jest zdecydowanie lepsze.local
polecenia, tj.local foo=$(false); echo $?;
Tworzy0
na wyjściu. Ale dotyczylocal
to tylko funkcji bash.źródło
command
zwraca błąd na ekranie, jak go ukryć?command
wypisuje błędy do stderr, możesz użyć formularzacommand 2> /dev/null && echo OK || echo Failed
. Do2> /dev/null
przekierowania stderr wyjście do/dev/null
. Jednak niektóre narzędzia wypiszą błędy na standardowe wyjście (mimo że jest to zła praktyka). W takim przypadku możesz pominąć 2 z przekierowania, ale stracisz dane wyjściowe z polecenia. Ta metoda sprawdzania sukcesu jest dobra w przypadku prostej logiki trójskładnikowej, ale w przypadku bardziej złożonych zachowań najlepiej jest sprawdzić$?
skuteczność polecenia lub użyćif
metody blokowej opisanej w odpowiedzi @ geirha.$? powinien zawierać status wyjścia z poprzedniego polecenia, który powinien wynosić zero, bez błędu.
Coś w stylu;
w większości przypadków łatwiej jest używać konstruktora && do łączenia poleceń, które muszą być od siebie zależne. Tak
cd /nonexistant && echo success!
by nie powtórzyć sukces, ponieważ przerwy dowodzenia przed &&. Następstwem tego jest ||, gdziecd /nonexistant || echo fail
będzie echo nie dlatego cd powiodło się. (staje się to przydatne, jeśli użyjesz czegoś takiego jak || exit, co zakończy skrypt, jeśli poprzednie polecenie się nie powiedzie.)źródło
źródło
command; echo $?
?true && echo $? || echo $?
/true; echo $?
ifalse && echo $? || echo $?
/false; echo $?
- przekonasz się, że robią dokładnie to samo: Dcommand && echo "success: $?" || echo "fail: $?"
Należy zauważyć, że
if...then...fi
i&&
/ lub||
typ podejścia dotyczy statusu wyjścia zwracanego przez polecenie, które chcemy przetestować (0 w przypadku powodzenia); jednak niektóre polecenia nie zwracają niezerowego statusu wyjścia, jeśli polecenie zakończyło się niepowodzeniem lub nie mogło poradzić sobie z danymi wejściowymi. Oznacza to, że zwykłeif
i&&
/||
podejścia nie będą działać dla tych konkretnych poleceń.Na przykład w systemie Linux GNU
file
nadal wychodzi z 0, jeśli otrzymał nieistniejący plik jako argument ifind
nie mógł zlokalizować określonego pliku użytkownika.W takich przypadkach jednym potencjalnym sposobem na poradzenie sobie z sytuacją jest odczyt
stderr
/stdin
komunikaty, np. Te, które zwróciłyfile
polecenie lub parsują dane wyjściowe polecenia jak wfind
. W tym celucase
można użyć instrukcji.(To jest odpowiedź mojej własnej odpowiedzi na powiązane pytanie na unix.stackexchange.com )
źródło
Jak wspomniano w wielu innych odpowiedziach, wystarczy prosty test
$?
tego typuJeśli chcesz sprawdzić, czy polecenie się nie powiodło , możesz użyć krótszej wersji w
bash
(ale być może przesadzonej) w następujący sposób:Działa to przy użyciu
(( ))
trybu arytmetycznego, więc jeśli polecenie zwróciłosuccess
, tj.$? = 0
Wtedy test oceni, do((0))
którego testufalse
, w przeciwnym razie wrócitrue
.Aby przetestować sukces , możesz użyć:
ale jest już niewiele krótszy niż pierwszy przykład.
źródło
Aby sprawdzić błędy w poleceniach:
Inspirowany Lean Manufacturing:
źródło
if [$ (polecenie)]; następnie echo „sukces”; fi
źródło
true
odnosi sukces,if [ $(true) ]; then echo "succeed"; fi
alesucceed
nie jest drukowany. W rzeczywistości nigdy nie sprawdza, czy sięcommand
udało. Powinien po prostu użyćif command
jak w poście geirha .$(
)
jest podstawieniem polecenia .[
]
jest wyrażeniem warunkowym . Brak podziału słów i rozwijania nazw plików , w zasadzie sprawdza, czycommand
dane wyjściowe.