Ich versuche, GNU Make 3.81 anzuweisen, nicht anzuhalten, wenn ein Befehl fehlschlägt (daher stelle ich dem Befehl das Präfix voran -
), aber ich möchte auch den Beendigungsstatus beim nächsten Befehl überprüfen und eine informativere Meldung ausgeben. Mein unten stehendes Makefile schlägt jedoch fehl:
$ cat Makefile
all:
-/bin/false
([ $$? -eq 0 ] && echo "success!") || echo "failure!"
$
$ make
/bin/false
make: [all] Error 1 (ignored)
([ $? -eq 0 ] && echo "success!") || echo "failure!"
success!
Warum echo das Makefile oben "Erfolg!" statt "scheitern!" ?
aktualisieren:
Im Folgenden wird die akzeptierte Antwort beschrieben und erweitert:
failure:
@-/bin/false && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
success:
@-/bin/true && ([ $$? -eq 0 ] && echo "success!") || echo "failure!"
.ONESHELL:
Richtlinie untersuchen..SHELLFLAGS = -ec
sollte verwendet werden. In diesem Fall können Sie jedoch nicht-
mehr das Präfix (für den persönlichen Befehl der Quittung) verwenden, da das make schreibt, dass der Fehler ignoriert wird, aber trotzdem den gesamten Block nicht besteht. Ist|| :
also eine Lösung, um den Befehl zu ignorieren. Aber es ist nicht plattformübergreifend (Windows hat nicht|| :
oder|| true
)Antworten:
Jeder Aktualisierungsbefehl in einer Makefile-Regel wird in einer separaten Shell ausgeführt. Also $? enthält nicht den Exit-Status des vorherigen fehlgeschlagenen Befehls, sondern den Standardwert für $? in einer neuen Schale. Deshalb sind deine [$? -eq 0] test ist immer erfolgreich.
quelle
Der Test von
$?
since&&
funktioniert nicht, wenn$?
Null||
ist, und wird bei einem Rückgabewert ungleich Null fortgesetzt.Und Sie brauchen das Minus nicht zu machen, da der Rückgabewert aus dem letzten Fortsetzungsprogrammaufruf der Zeile übernommen wird. Das funktioniert also gut
Fehler:
Erfolg:
Das Gegenteil ist der Fall: Wenn Sie Ihre eigene Nachricht verfassen und den Erstellungsprozess trotzdem mit einem Wert ungleich Null unterbrechen möchten, müssen Sie Folgendes schreiben:
Fehler:
quelle
Aus der GNU make Dokumentation :
Um
make
in einem solchen Fall den Exit-Status von zu verwenden, führen Sie Folgendesmake
aus:Und lassen Sie Ihr Makefile enthalten:
quelle