¿Suprimir el eco de la invocación de comandos en makefile?

147

Escribí un programa para una tarea que se supone que imprime su salida en stdout. La especificación de asignación requiere la creación de un Makefile que, cuando se invoca, make run > outputFiledebe ejecutar el programa y escribir la salida en un archivo, que tiene una huella digital SHA1 idéntica a la especificada en la especificación.

Mi problema es que mi archivo MAKE:

...
run:
     java myprogram

también imprime el comando que ejecuta mi programa (por ejemplo, java myprogram) en el archivo de salida, de modo que mi archivo incluye esta línea adicional que hace que la huella digital sea incorrecta.

¿Hay alguna forma de ejecutar un comando sin que la invocación del comando haga eco en la línea de comando?

novador
fuente

Respuestas:

247

Agregue @al comienzo del comando para indicarle a gmake que no imprima el comando que se está ejecutando. Me gusta esto:

run:
     @java myprogram

Como sugirió Oli, esta es una característica de Make y no de Bash.

Por otro lado, Bash nunca hará eco de los comandos que se ejecutan a menos que se lo indique explícitamente (es decir, con la -xopción).


fuente
66
+1. Pero solo para aclarar la confusión del OP, quizás valga la pena aclarar que esta es una característica de Make, no de Bash.
Oliver Charlesworth
1
@OliCharlesworth: tiene sentido, agregó eso. Gracias.
¿Hay alguna forma de desactivar todos los ecos? ¿O de apagarlo para una sección y volver a encenderlo más tarde?
Benubird
2
@Benubird make -shace eso, y en mi humilde opinión es una solución mucho mejor aquí de todos modos. Recientemente se publicó como una respuesta separada a esta pregunta.
tripleee
1
esto no funciona para una declaración if ... then :( ¿alguna idea?
user1623521
74

¡Aún más simple, use make -s(modo silencioso)!

usuario3619296
fuente
3
Voto a favor: Esta debería ser la respuesta aceptada aquí. Rociar tu Makefile con @comandos hace que sea difícil de depurar y agrega mucho desorden.
tripleee
11
Estoy de acuerdo en que este es el camino a seguir, pero tenga en cuenta que, en la descripción original del problema, no sería yo quien invocaría a mi instructor. Por lo tanto, no tendría control sobre los indicadores pasados. Necesitaba controlar la salida desde el archivo MAKE. Sin embargo, vota a favor de la solución más práctica en el mundo real.
noobler
66
Puede controlar esto usted mismo, utilizando el .SILENT:objetivo. Ver make.mad-scientist.net/managing-recipe-echoing
MadScientist
En realidad, si tienes advertencias como -Wallsi todavía las imprimiera. Por supuesto, ¿por qué usarías -ssi también quieres ver advertencias?
Usuario81862311
33

También puedes usar .SILENT

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

En este caso, make hidará salida al comando, pero make runno dará salida.

Kien Pham
fuente
1

El efecto de preceder el comando con un @se puede extender a una sección extendiendo el comando usando una barra diagonal inversa en la línea. Si .PHONYse desea un comando para suprimir la salida, se puede comenzar la sección con:

@printf "..."
Wiley
fuente