Supprimer l'écho de l'invocation de commande dans makefile?


147

J'ai écrit un programme pour une affectation qui est censée imprimer sa sortie sur stdout. La spécification d'affectation nécessite la création d'un Makefile qui, lorsqu'il est appelé, make run > outputFiledoit exécuter le programme et écrire la sortie dans un fichier, qui a une empreinte SHA1 identique à celle donnée dans la spécification.

Mon problème est que mon makefile:

...
run:
     java myprogram

imprime également la commande qui exécute mon programme (par exemple java myprogram) dans le fichier de sortie, de sorte que mon fichier inclut cette ligne supplémentaire causant une erreur d'empreinte digitale.

Existe-t-il un moyen d'exécuter une commande sans que l'invocation de la commande ne fasse écho à la ligne de commande?

Réponses:


247

Ajoutez @au début de la commande pour dire à gmake de ne pas afficher la commande en cours d'exécution. Comme ça:

run:
     @java myprogram

Comme Oli l'a suggéré, il s'agit d'une fonctionnalité de Make et non de Bash.

D'un autre côté, Bash ne fera jamais écho aux commandes exécutées à moins que vous ne lui disiez de le faire explicitement (c'est-à-dire avec -xoption).


6
+1. Mais juste pour dissiper la confusion du PO, il vaut peut-être la peine de préciser qu'il s'agit d'une fonctionnalité de Make, pas de Bash.
Oliver Charlesworth

1
@OliCharlesworth: c'est logique, a ajouté cela. Merci.

Existe-t-il un moyen de désactiver tous les échos? Ou de le désactiver pour une section et de le rallumer plus tard?
Benubird

2
@Benubird make -sfait cela, et IMHO est une bien meilleure solution ici de toute façon. Il a récemment été publié en tant que réponse distincte à cette question.
tripleee

1
cela ne fonctionne pas pour une instruction if ... then: (des idées?
user1623521

74

Encore plus simple, utilisez make -s(mode silencieux)!


3
Upvote: Cela devrait vraiment être la réponse acceptée ici. Saupoudrer votre Makefile avec des @commandes rend le débogage difficile et ajoute beaucoup de désordre.
tripleee

11
Je suis d'accord que c'est la voie à suivre - mais remarquez, dans la description originale du problème, je ne serais pas celui qui invoquerait make - mon instructeur serait. Ainsi, je n'aurais aucun contrôle sur les drapeaux transmis. J'avais besoin de contrôler la sortie depuis le makefile. Cependant, voter pour la solution la plus pratique dans le monde réel.
noobler le

6
Vous pouvez contrôler cela vous-même, en utilisant la .SILENT:cible. Voir make.mad-scientist.net/managing-recipe-echoing
MadScientist

En fait, si vous avez des avertissements, -Wallil les imprime toujours. Bien sûr, pourquoi l'utiliseriez -s-vous si vous souhaitez également voir les avertissements?
User81862311

33

Vous pouvez aussi utiliser .SILENT

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

Dans ce cas, make hiémettra la commande, mais make runne sortira pas.


1

L'effet de précéder la commande avec un @peut être étendu à une section en étendant la commande à l'aide d'une barre oblique inverse de fin sur la ligne. Si une .PHONYcommande est souhaitée pour supprimer la sortie, on peut commencer la section par:

@printf "..."
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.