Ich frage mich, wie ich ein Echo in einem Makefile vermeiden kann:
clean:
rm -fr *.o
wird diese Regel gedruckt:
$>make clean
rm -fr *.o
$>
Wie kann ich das vermeiden?
Ich frage mich, wie ich ein Echo in einem Makefile vermeiden kann:
clean:
rm -fr *.o
wird diese Regel gedruckt:
$>make clean
rm -fr *.o
$>
Wie kann ich das vermeiden?
Zunächst einmal: der eigentliche Befehl muss in der nächsten Zeile stehen (zumindest ist das bei GNU Make der Fall, bei anderen Make's könnte das anders sein - ich bin mir da nicht sicher)
clean:
rm -rf *.o
(Hinweis: Sie benötigen eine TAB avant rm -rf *.o
wie in jeder Regel)
Sie kann stumm geschaltet werden, indem man ein vorangestelltes @
:
Damit wird Ihr Makefile zu
clean:
@rm -rf *.o
Wenn es keine *.o
Dateien zu löschen, kann es trotzdem zu einer Fehlermeldung kommen. Um diese zu unterdrücken, fügen Sie Folgendes hinzu
clean:
-@rm -rf *.o 2>/dev/null || true
2>/dev/null
alle Fehlermeldungen nach /dev/null zu leiten - so sehen Sie keine Fehler-
vor dem Befehl stellt sicher, dass make
ignoriert einen Rückgabewert ungleich NullIch reagiere auf dieses uralte Thema, weil es in der Suche weit oben erscheint und die Antworten verwirrend sind. Um genau das zu tun, was der Benutzer will, ist alles, was benötigt wird:
clean:
@rm -f *.o
Das @ bedeutet, dass make diesen Befehl nicht ausgibt. Das -f
Argument zu rm
sagt rm
um Fehler zu ignorieren, z. B. dass es keine *.o
Dateien, und immer erfolgreich zu sein.
Ich habe das -r aus dem OP-Beispiel entfernt, weil es rekursiv bedeutet, und hier sind wir nur rm
ing .o
Dateien, nichts zu rekursieren.
Es besteht keine Notwendigkeit für die 2>&1 >/dev/null
denn mit dem -f
es werden keine Fehler gedruckt.
.SILENT: clean
funktioniert anstelle des @
aber es befindet sich nicht an der gleichen Stelle im Makefile wie der Befehl, den es beeinflusst, so dass jemand, der das Projekt später pflegt, verwirrt sein könnte. Deshalb ist @ vorzuziehen. Es ist eine bessere Lokalisierung der Referenz.
Aus dem Handbuch: .SILENT
ist im Wesentlichen überflüssig, da @
ist flexibler.
Viel schlimmer ist, dass machen. druckt viel zu viele Informationen. Warn-/Fehler-/Privatmeldungen sind in der Ausgabe vergraben. Auf der anderen Seite -s
( .SILENT
) unterdrückt einfach alles. Besonders die Meldungen "nichts zu tun" und "auf dem neuesten Stand" können nerven. Es gibt keine Möglichkeit, sie zu unterdrücken. Sie müssen sie aktiv herausfiltern oder etwas verwenden wie Farbe machen . Hier ist eine Lösung für grep :
make | egrep -hiv 'nothing to be done|up to date'
Die Ausgabe wird jedoch Zeilennummern enthalten. Die Perl-Lösung ist daher besser, weil sie Zeilennummern unterdrückt und stdout sofort spült:
make | perl -ne '$|=1; print unless /nothing to be done|up to date/i'
Make ist ein fehlerhaftes Werkzeug. "Was ist falsch an GNU make?" erklärt dies besser als ich es kann.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.