Ten skrypt nie echa „po”:
#!/bin/bash -e
echo "before"
echo "anything" | grep e # it would if I searched for 'y' instead
echo "after"
exit
Byłoby tak również, gdybym usunął -e
opcję z linii shebang, ale chcę ją zachować, aby mój skrypt zatrzymał się w przypadku wystąpienia błędu. Nie uważam, że grep nie znalazł dopasowania jako błędu. Jak mogę zapobiec tak nagłemu opuszczeniu?
bash
grep
exit
error-handling
iago-lito
źródło
źródło
-e
zakładasz, że troszczysz się o to: tak bardzo, że każdy problem jest katastrofalny.var=$(complex command | grep complex_pattern)
która może być zerowa (w takim przypadku mój program nie powinien się zakończyć). Jest to po prostu spreparowany skrypt, który powoduje występowanie problemu. Nie ma tutaj metafizycznej czarnej dziury, prawda? ;)Odpowiedzi:
Wyjaśnienie:
„||” oznacza „lub”. Jeśli pierwsza część polecenia „nie powiedzie się” (co oznacza, że „grep e” zwraca niezerowy kod wyjścia), to część po „||” jest wykonywany, kończy się powodzeniem i zwraca zero jako kod wyjścia (
true
zawsze zwraca zero).źródło
/bin/true
to:command || :
(więc w twoim przypadku,set -e; grep 'needle' haystack || :
).true
jest wbudowany w niektóre powłoki (przynajmniejbash 4.3
na RHEL)Solidny sposób na bezpieczne i opcjonalne
grep
przesyłanie wiadomości:Zgodnie z instrukcją posix kod wyjścia 1 oznacza brak wybranych linii, a> 1 oznacza błąd.
źródło
Inną opcją jest dodanie kolejnej komendy do potoku - takiej, która nie zawiedzie:
echo "anything" | grep e | cat
Ponieważ
cat
jest to ostatnie polecenie w potoku, to status wyjściacat
, a nie opcjigrep
, będzie użyty do ustalenia, czy potok się nie powiódł.źródło
Inna opcja:
źródło
Rozwiązanie
Wyjaśnienie
set -e
lubset -o errexit
Plus
:
to polecenie bez efektu w Bash.źródło