set-e und kurzen tests
Wenn ich war neu in shell-scripting, dass ich eine Menge von kurzen tests statt if
Aussagen, wie false && true
.
Dann später habe ich gelernt, mit set -e
, und fand meine Scripte waren zu sterben für einige Grund, und Sie würde funktionieren, wenn ich durch die kurzen tests mit voller if
Aussagen. Nun, die Zeit ist vorbei, und ich benutze immer noch voller if
Aussagen nur.
Das interessanteste ist, dass, wenn ich öffnen Sie eine interaktive shell, und führen Sie Folgendes aus:
set -e
false && true
echo $?
es gibt 1 zurück, aber die Schale nicht sterben!
Ich sehe, dass ich verschwendet viel zu viele code-Zeilen. Könnte jemand mir erklären wie kann ich set -e
mit kurzen tests sicher, zB. ohne das Skript zu sterben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Single UNIX Specification beschreibt die Wirkung der
set -e
als:Wie Sie sehen, einen fehlerhaften Befehl in einer Liste UND nicht die shell beenden.
Mit
set -e
Shell-Skripte mit
set -e
wird als die beste Praxis, da es in der Regel sicherer, das Skript abgebrochen, wenn ein Fehler Auftritt. Wenn ein Befehl fehlschlagen harmlos, ich in der Regel append|| true
zu.Hier ist ein einfaches Beispiel:
rm -f
.if
Aussagen?( false && true )
( false && true )
, dass1
?1
. In diesem Fall ist es sicherer, verwenden Sie eineif
oder||:
false && true
ist ein UND die Liste, und nicht um die Schale zu sterben, während( false && true )
ist gesehen durch die (äußere) Schale wie einen einzelnen Befehl. Die Klammern do einen Unterschied machen.Musst du am Ende jeder Befehl, der fehlschlagen mit
||
und einen Befehl oder eine Befehlsliste, die Bewertung zu 0. Mit||
löst dein Befehl, wenn der Ausdruck vor der operator-Auswertung nicht 0. Ihr Befehl zu bewerten, muss auf 0, um nicht töten die Muschel.Beispiel:
false && true
nicht zu einem exit, weil die Endung-Ausdruck wird ausgewertet und liefert 0. Von der bash man-page fürset -e
:Nur der Letzte Befehl ausgeführt, wenn in
||
/&&
Kette auslösen können, beenden.Den folgenden Ausdruck wird nicht aus dem oben genannten Grund.
aber das folgende nicht:
weil
true && false
ist Teil der Prüfung folgendeif
.Bezug auf mein problem, das Skript unerwartet sterben, ist es durch das laufen diesen kurzen tests in einer subshell, oder von einer Funktion, und diese Funktion gibt einen Wert anders als null:
Ursprünglichen Beispiel:
Mithilfe einer subshell oder Funktion:
Mögliche Lösungen:
Das Verhalten von
set -e
ist unintuitiv in allen außer den einfachsten Fällen, und verändert hat über die Jahre mehrmals. Deshalb habe ich nicht empfehlen es zu benutzen, außer in wirklich einfachen scripts (einfache Sequenzen von Befehlen).Beachten Sie, dass Befehle in einem Makefile sind in der Regel mit ausgeführt
set -e
in Kraft, so ist es immer noch oft gebraucht, um etwas zu verstehen über, wie es funktioniert.Den
&&
und||
Operatoren erlauben es, einen ähnlichen Effekt mit relativ wenig Unordnung, aber es nicht ausdrücklich. Insbesondere eine&&
platziert werden, die am Ende einer Zeile, ähnlich wie ein `;'.set -e
im Skripte mit tausenden Zeilen von code. Die beste Praxis ist es, meiner Meinung nach, verwenden Sie es in der Entwicklung Phasen zusammen mitset -x
, und entfernen Sie Sie dann, wenn Sie Angst, es könnte scheitern, nach dem release. Obwohl ich nicht entfernen, auch nach der Entlassung, aber nur hinzufügen|| true
auf ein paar Zeilen weiß ich kann scheitern, ohne Probleme.