¿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?

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


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)!


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.


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 "..."
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.