Dieses Skript gibt kein "after" zurück:
#!/bin/bash -e
echo "before"
echo "anything" | grep e # it would if I searched for 'y' instead
echo "after"
exit
Es würde auch funktionieren, wenn ich die -e
Option in der Shebang-Zeile entferne , aber ich möchte sie behalten, damit mein Skript bei einem Fehler stoppt. Ich betrachte grep, das keine Übereinstimmung gefunden wird, nicht als Fehler. Wie kann ich verhindern, dass es so plötzlich beendet wird?
bash
grep
exit
error-handling
iago-lito
quelle
quelle
-e
Sie sich darum kümmern, dass jedes Problem katastrophal ist.var=$(complex command | grep complex_pattern)
null ist (in diesem Fall sollte mein Programm nicht beendet werden). Dies ist nur ein abgekochtes Skript, das das Problem verursacht. Kein metaphysisches Schwarzes Loch in der Logik, oder? ;)Antworten:
Erläuterung:
Das "||" bedeutet "oder". Wenn der erste Teil des Befehls "failed" (was bedeutet, dass "grep e" einen Exit-Code ungleich Null zurückgibt) ist der Teil nach dem "||" wird ausgeführt, ist erfolgreich und gibt Null als Exit-Code zurück (gibt
true
immer Null zurück).quelle
/bin/true
ist:command || :
(in Ihrem Fall alsoset -e; grep 'needle' haystack || :
).true
ist in einigen Shells eingebaut (zumindestbash 4.3
auf RHEL)Eine robuste Möglichkeit, Nachrichten sicher und optional zu
grep
versenden:Exit-Code 1 bedeutet laut posix-Handbuch , dass keine Zeilen ausgewählt sind, und> 1 bedeutet, dass ein Fehler vorliegt.
quelle
Eine andere Möglichkeit besteht darin, der Pipeline einen weiteren Befehl hinzuzufügen, der nicht fehlschlägt:
echo "anything" | grep e | cat
Da
cat
es sich nun um den letzten Befehl in der Pipeline handelt, wird der Beendigungsstatus voncat
und nicht von verwendetgrep
, um zu bestimmen, ob die Pipeline fehlgeschlagen ist oder nicht.quelle
Andere Option:
quelle
Lösung
Erläuterung
set -e
oderset -o errexit
Plus,
:
ist der No-Effect-Befehl in Bash.quelle