Wie kann ich ein Shell-Skript schreiben, das beendet wird, wenn ein Teil davon fehlschlägt? Wenn beispielsweise der folgende Codeausschnitt fehlschlägt, sollte das Skript beendet werden.
n=0
until [ $n -ge 5 ]
do
gksu *command* && break
n=$[$n+1]
sleep 3
bash
scripting
error-handling
Weylyn
quelle
quelle
set -e
-Funktion zu verwenden. Hier trifft es allerdings nicht wirklich zu. Das OP möchte das Skript nach 5 fehlgeschlagenen Versuchen, den Befehl auszuführen, beenden.set -e
das weiß ich nur so.set -e
werdensleep
(dabreak
es sich um ein spezielles Feature handelt, wird das Skript bei Fehlern in den meisten Shells beendet. Befehle inif
oder links davon&&
sind davon nicht betroffenset -e
, könnenn=...
jedoch fehlschlagen, wenn sien
schreibgeschützt sind.) das würde das Skript auch ohne verlassenset -e
, so dass die Interpretation ziemlich unwahrscheinlich klingt. Ich bin damit einverstanden, dass die Frage schlecht formuliert ist.Sie können ein Skript an einer beliebigen Stelle mit dem Schlüsselwort beenden
exit
. Sie können auch einen Exit - Code angeben , um andere Programme , um anzuzeigen , dass oder wie Ihr Skript fehlgeschlagen ist , zBexit 1
oderexit 2
usw. (Vereinbarungs Exit - Code 0 ist für den Erfolg und etwas größer als 0 bedeutet Versagen, aber auch durch Konvention, Ausfahrt Codes über 127 sind für eine abnormale Beendigung reserviert (z. B. durch ein Signal).Die generische Konstruktion, die bei einem Ausfall beendet werden soll, ist
mit passendem
failure condition
undn
. In bestimmten Szenarien können Sie jedoch anders vorgehen. Für Ihren Fall interpretiere ich Ihre Frage so, dass Sie den Vorgang beenden möchten, wenn einer der fünfgksu
fehlgeschlagenen Aufrufe fehlschlägt. Eine Möglichkeit besteht darin, eine solche Funktion zu verwendenRufen Sie dann die Schleife von auf
try_command
.Es gibt (fortgeschrittenere) oder ausgefeiltere Möglichkeiten, um Ihre Frage zu beantworten. Die obige Lösung ist jedoch für Anfänger zugänglicher als beispielsweise Stephanes Lösung.
quelle
exit
Beendet das Skript, sofern es nicht in einer Subshell aufgerufen wird. Befindet sich dieser Teil des Skripts in einer Subshell, z. B. weil er sich in(...)
oder innerhalb einer Pipeline befindet,$(...)
wird nur diese Subshell beendet .Wenn Sie in diesem Fall möchten, dass das Skript zusätzlich zur Subshell beendet wird, müssen Sie
exit
diese Subshell beenden.Zum Beispiel hier mit 2 verschachtelten Ebenen von Subshells:
Es kann schwieriger werden, wenn die Subshell Teil einer Pipeline ist.
bash
hat ein spezielles$PIPESTATUS
Array, ähnlich demzsh
,$pipestatus
das Ihnen hier helfen kann:quelle
Die Falle führt beim Empfang eines Signals eine Aktion aus.
Führen Sie dies aus und lassen Sie es normal beenden. Es wird auf Signal 0 abgefangen.
Führen Sie es erneut aus und unterbrechen Sie mit ^ C. Es fängt sowohl das Signal 2 als auch das Signal 0 ab.
Ein Ausgangsstatus ungleich Null wird bei ERR abgefangen
quelle