Make: Wie fahre ich fort, nachdem ein Befehl fehlgeschlagen ist?


142

Der Befehl $ make allgibt Fehler aus, z. B. rm: cannot remove '.lambda': No such file or directorystoppt er. Ich möchte, dass es die rm-not-found-Fehler ignoriert. Wie kann ich erzwingen?

Makefile

all:
        make clean
        make .lambda
        make .lambda_t
        make .activity
        make .activity_t_lambda
clean:
        rm .lambda .lambda_t .activity .activity_t_lambda

.lambda:
        awk '{printf "%.4f \n", log(2)/log(2.71828183)/$$1}' t_year > .lambda

.lambda_t:
        paste .lambda t_year > .lambda_t

.activity:
        awk '{printf "%.4f \n", $$1*2.71828183^(-$$1*$$2)}' .lambda_t > .activity

.activity_t_lambda:
        paste .activity t_year .lambda  | sed -e 's@\t@\t\&\t@g' -e 's@$$@\t\\\\@g' | tee > .activity_t_lambda > ../RESULTS/currentActivity.tex

Antworten:


263

Versuchen Sie die -iFlagge (oder --ignore-errors). Die Dokumentation scheint übrigens einen robusteren Weg vorzuschlagen, um dies zu erreichen:

Um Fehler in einer Befehlszeile zu ignorieren, schreiben Sie ein -am Anfang des Zeilentextes (nach der ersten Registerkarte). Das -wird verworfen, bevor der Befehl zur Ausführung an die Shell übergeben wird.

Beispielsweise,

clean:
  -rm -f *.o

Dies führt rmdazu, dass fortgesetzt wird, auch wenn eine Datei nicht entfernt werden kann.

Alle Beispiele sind mit rm, können aber auf jeden anderen Befehl angewendet werden, bei dem Sie Fehler von (dh mkdir) ignorieren müssen .


30
Sie nicht tun , dass! Sie sollten Fehler nicht ignorieren. Fügen Sie einfach das Flag -f zu rm hinzu, und es schlägt nicht mehr fehl, wenn Sie versuchen, nicht vorhandene Dateien zu löschen. Es wird jedoch immer noch ein Fehler zurückgegeben, wenn eine Datei nicht wirklich gelöscht werden kann. Das ist das Verhalten, das Sie wollen, scheitern Sie, wenn es ein Problem gibt!
Kristof Provost

15
@ Kristof Provost vereinbart. rm -fist besser für das spezifische Problem, das der Benutzer hat, aber es ist immer noch schön, über die allgemeine Lösung Bescheid zu wissen, auch wenn sie manchmal unsicher ist.
Brian_o

1
Das ist wirklich nützlich, Eli. Danke dir.
Dr. Beco

1
Make bietet auch $(RM), die Sie anstelle von verwenden können rm -f.
Reitermarkus

32

make -k(oder --keep-goingauf Gnumake) wird tun, was Sie verlangen, denke ich.

Sie sollten wirklich -fdie fehlerhafte del- oder rm-Zeile finden und eine hinzufügen, um zu verhindern, dass dieser Fehler bei anderen auftritt.


1
Ich wollte nichts sagen, aber ich fragte mich, was sie auch dachten. Wenn es einen Grund gibt, warum diese Flagge nicht angemessen wäre, wäre es eine gute Sache, sie zu erwähnen.
TED

3
Sie sollten Fehler nicht ignorieren. Die von Brian, Oded und NebuSoft vorgeschlagene Lösung ist korrekt. Diese und die akzeptierte Antwort sind falsch.
Kristof Provost

1
@ KristofProvost - Ah. Fair genug, denke ich. Im Allgemeinen glaube ich auch, dass Antworten, die dem Problem zugrunde liegen, denen (wie dieser) überlegen sind, die die gestellte Frage nur selten beantworten. Ich bin nicht sicher, ob ich jemanden dafür ablehnen würde , aber verschiedene Schläge ...
TED

5
Gute Antwort. Es enthält ein einfaches Flag der obersten Ebene, das keine andere Antwort enthält, aber dennoch das richtige Verhalten empfiehlt. Fehler sollten nicht ignoriert werden, aber es ist gut, die Optionen zu kennen.
Brian_o

1
Es ist nützlich, Compilerfehler zu ignorieren make, um so viele Kompilierungseinheiten wie möglich zu erstellen, während Sie das Problem beheben, an dem der Compiler erstickt ist. Auf diese Weise müssen Sie nicht warten, bis auch alles andere erstellt ist, wenn Sie das Problem behoben haben.
Inetknght

20

Wechseln Sie sauber zu

rm -f .lambda .lambda_t .activity .activity_t_lambda

Dh nicht zum Entfernen auffordern; Beschweren Sie sich nicht, wenn die Datei nicht vorhanden ist.


16

Rückgabe erfolgreich durch Blockieren rmdes Rückkehrcodes hinter einer Pipe mit dem trueBefehl, der immer zurückgibt 0(Erfolg)

rm file | true

11

Um make dazu zu bringen, Fehler in einer einzelnen Zeile tatsächlich zu ignorieren, können Sie sie einfach mit dem Suffix versehen ; trueund den Rückgabewert auf 0 setzen. Beispiel:

rm .lambda .lambda_t .activity .activity_t_lambda 2>/dev/null; true

Dadurch wird die stderr-Ausgabe auf null umgeleitet und dem Befehl mit true gefolgt (was immer 0 zurückgibt, wodurch angenommen wird, dass der Befehl erfolgreich war, unabhängig davon, was tatsächlich passiert ist), sodass der Programmfluss fortgesetzt werden kann.


1
Dies funktioniert für mich, wo der führende Bindestrich dies nicht tut (ich bekomme ein Makefile, um einen Test auszuführen, der fehlschlagen muss, und werde die Protokolle später analysieren)
Sean Houlihane

2

Ändern Sie Ihre cleanso rmwird nicht beschweren:

clean:
    rm -f .lambda .lambda_t .activity .activity_t_lambda

1

Fügen Sie eine -fOption in Ihren rmBefehl ein.

rm -f .lambda .lambda_t .activity .activity_t_lambda
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.