2010-08-05 14 views
12

Estoy escribiendo un breve script de shell que llama 'make all'. No es crítico, pero ¿hay alguna forma de que pueda suprimir el mensaje que dice 'no hay nada que hacer para todos' si ese es el caso? Estoy esperando encontrar una bandera para make que suprima esto (no estoy seguro de que exista), pero una línea adicional o 2 de código también funcionaría.Suprimir "no hay nada que hacer para 'todo'"

FYI Estoy usando bash.

Editar: para ser más claro, solo quiero suppess mensajes que no hay nada que hacer. De lo contrario, quiero mostrar la salida.

Respuesta

13

Puede hacer "todo" un objetivo PHONY (si no lo está ya) que tiene el verdadero objetivo, como requisito previo, y hace algo poco visible:

.PHONY: all 

all: realTarget 
    @echo > /dev/null 
+10

En lugar de repetir, probablemente puedas hacer @: para una no-operatoria –

+0

@William Pursell: por Dios, tienes razón. Nunca supe ':' era un shell no-operativo ... o que alguna vez podría utilizarlo. – Beta

+1

Me gusta este enfoque furtivo. La advertencia se va porque 'todos' ahora tiene algo que ver, pero lo que hace es nada. Otra opción para 'echo' es hacer que la acción sea '@ true ', lo que no debe imprimir nada y tener éxito silencioso. – RBerteig

1

La bandera -s silencios hacen: make -s all

EDIT: originalmente me respondió que la bandera -q maquillaje silenciada. Funciona para mí, aunque la página de manual especifica -s, --silent, --quiet como las banderas válidas.

+0

W Tenney, para mí esto es '-s',' '--silent' o --quiet' – Anders

+1

que debería haber sido Mas claro. Solo quiero suprimir el caso donde los archivos están actualizados. De lo contrario, quiero mostrar la salida. – sas4740

+0

Vi que alguien más respondió y sugirió 'hacer todo | grep -v "No hay nada que hacer", pero parece que eliminaron esa respuesta. –

0

La solución grep:

{ make all 2>&1 1>&3 | grep -v 'No rule to make target `all' >&2; } 3>&1 

El constructo 2>&1 1>&3 envía stdout de maquillaje a fd 3 y de hacer stderr a stdout. grep luego lee de stdout del comando anterior, elimina la línea ofensiva y envía su stdout a stderr. Finalmente, fd 3 regresa a stdout.

+0

¿Es todo lo realmente necesario? ¿Qué diferente de solo hacer grep -v? – sas4740

+1

En primer lugar, en mi marca de todos modos, ese mensaje va a stderr, por lo que al menos tienes que redireccionar stderr para que grep tenga algún efecto. A continuación, no quiso tocar el resto de la salida de make, así que no quería mezclar stderr con stdout. Por último, es un ejercicio de aprendizaje para mí también. –

6

me gustaría mejorar en la anterior solución, simplemente para que sea un poco más eficiente ... :)

.PHONY: all 
all: realTarget 
     @true 
Cuestiones relacionadas