Echo des Befehlsaufrufs im Makefile unterdrücken?

147

Ich habe ein Programm für eine Aufgabe geschrieben, das seine Ausgabe auf stdout drucken soll. Die Zuweisungsspezifikation erfordert die Erstellung eines Makefiles, das beim Aufrufen make run > outputFiledas Programm ausführen und die Ausgabe in eine Datei schreiben soll, deren SHA1-Fingerabdruck mit dem in der Spezifikation angegebenen identisch ist.

Mein Problem ist, dass mein Makefile:

...
run:
     java myprogram

druckt auch den Befehl, der mein Programm ausführt (z. B. Java Myprogram), in die Ausgabedatei, sodass meine Datei diese zusätzliche Zeile enthält, wodurch der Fingerabdruck falsch ist.

Gibt es eine Möglichkeit, einen Befehl auszuführen, ohne dass der Befehlsaufruf in der Befehlszeile wiedergegeben wird?

Noobler
quelle

Antworten:

247

Fügen Sie @am Anfang des Befehls hinzu, um gmake anzuweisen, den ausgeführten Befehl nicht zu drucken. So was:

run:
     @java myprogram

Wie Oli vorgeschlagen hat, ist dies eine Funktion von Make und nicht von Bash.

Auf der anderen Seite gibt Bash niemals Befehle aus, die ausgeführt werden, es sei denn, Sie weisen ihn an, dies explizit zu tun (dh mit -xOption).


quelle
6
+1. Aber nur um die Verwirrung des OP zu beseitigen, ist es vielleicht wert zu klären, dass dies ein Merkmal von Make ist, nicht von Bash.
Oliver Charlesworth
1
@OliCharlesworth: macht Sinn, fügte hinzu. Vielen Dank.
Gibt es eine Möglichkeit, alle Echos zu deaktivieren? Oder es für einen Abschnitt auszuschalten und später wieder einzuschalten?
Benubird
2
@Benubird make -smacht das und IMHO ist hier sowieso eine viel bessere Lösung. Es wurde kürzlich als separate Antwort auf diese Frage veröffentlicht.
Tripleee
1
Dies funktioniert nicht für eine if ... then-Anweisung :( irgendwelche Ideen?
user1623521
74

Noch einfacher zu bedienen make -s(Silent Mode)!

user3619296
quelle
3
Upvote: Dies sollte hier wirklich die akzeptierte Antwort sein. Das Besprühen Ihres Makefiles mit @Befehlen erschwert das Debuggen und sorgt für viel Unordnung.
Tripleee
11
Ich bin damit einverstanden, dass dies der richtige Weg ist - aber beachten Sie, dass ich in der ursprünglichen Problembeschreibung nicht derjenige bin, der make aufruft - mein Ausbilder wäre es. Somit hätte ich keine Kontrolle über die übergebenen Flags. Ich musste die Ausgabe innerhalb des Makefiles steuern. Upvote für die praktischste Lösung in der realen Welt.
Noobler
6
Sie können dies selbst steuern, indem Sie das .SILENT:Ziel verwenden. Siehe make.mad-scientist.net/managing-recipe-echoing
MadScientist
Eigentlich, wenn Sie Warnungen auf wie -Walles hat, druckt sie immer noch. Natürlich, warum sollten Sie verwenden, -swenn Sie auch Warnungen sehen möchten?
User81862311
33

Sie können auch verwenden .SILENT

.SILENT: run
hi:
     echo "Hola!"
run:
     java myprogram

In diesem Fall make hiwird der Befehl ausgegeben, aber make runnicht ausgegeben.

Kien Pham
quelle
1

Der Effekt, dem Befehl ein vorangestellt zu haben, @kann auf einen Abschnitt erweitert werden, indem der Befehl mit einem abschließenden Backslash in der Zeile erweitert wird. Wenn ein .PHONYBefehl zur Unterdrückung der Ausgabe gewünscht wird, kann der Abschnitt mit Folgendem beginnen:

@printf "..."
Wiley
quelle