59 Stimmen

Meldungen in make clean unterdrücken (Makefile silent remove)

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?

88voto

plof Punkte 1234

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
  • die - vor dem Befehl stellt sicher, dass make ignoriert einen Rückgabewert ungleich Null

37voto

claf Punkte 8682

Eigentlich habe ich nach etwas anderem gesucht und diese Zeile in das Makefile eingefügt:

.SILENT:clean

während jeder Schritt des "sauberen" Ziels stillschweigend ausgeführt wird.

Bis jemand einen Nachteil aufzeigt, ist dies meine bevorzugte Lösung!

32voto

phorgan1 Punkte 1574

Ich 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.

10voto

SCFrench Punkte 8074

Wenn Sie dem Befehl ein @ vorangestellt haben, wird er nicht auf der Shell ausgegeben. Versuchen Sie, rm in @rm zu ändern. ( Referenz )

4voto

Andreas Spindler Punkte 6601

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.com

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.

Powered by:

X