2012-08-01 21 views
15

Quiero redirigir la salida de un script a un programa diferente. Algo que haría normalmente utilizando estas dos formas:Redireccionando stdout y stderr dentro de una regla Makefile

python test.py 2>&1 | pyrg 
python test.py |& pyrg 

Mi problema es que no funciona desde el interior de un makefile:

[Makefile] 
test: 
    python test.py 2>&1 | pyrg [doesn't work] 

Deseo evitar escribir un archivo de script que hace el trabajo .

Editar:

Este parece ser un tema pyrg:

python test.py 2>&1 | tee test.out // Writes to the file both stderr and stdout 
cat test.out | pyrg    // Works fine! 
python test.py 2>&1 | pyrg   // pyrg behaves as if it got no input 

Esta es una mala solución para mí, ya que nunca se llega a la parte cat en caso de un fallo de la prueba (todo es dentro de una regla Makefile)

+4

Esto debería funcionar. 'make' pasa toda la línea a'/bin/sh' para su interpretación, por lo que cualquier cosa que este shell (que no necesita ser su shell de usuario) pueda entender las obras. –

+2

Exactamente ¿cómo no funciona? Intenta configurar 'exportar SHELL: =/bin/bash' en algún lugar de tu archivo MAKE. –

+0

El segundo comando se ejecuta como si no hubiera recibido ninguna entrada de 'stdin'. Y realmente se ejecuta antes que el primero. El uso de '||' en lugar de '|' mantiene el orden pero una vez más 'pyrg' no recibe la entrada. – Xyand

Respuesta

3

No explica por qué los enfoques directos no funcionan, pero hace el truco:

[Makefile] 
test: 
    python test.py >test.out 2>&1; pyrg <test.out 
8

Me encontré con esta pregunta con el mismo problema y no estaba satisfecho con la respuesta. Tenía un TLBN binario que falló en el caso de prueba example2.TLBN.

Esto es lo que miró mi archivo make primero.

make: 
    ./TLBN example2.TLBN > ex2_output.txt 

Lo que falló con el mensaje de error que esperaba y detener el proceso de fabricación.

Esta es mi solución:

make: 
    -./TLBN example2.TLBN > ex2_output.txt 2>&1 

Nota del - al principio de la línea que dice hacer caso omiso a cualquier salida a stderr.

Espero que esto ayude a alguien que tenga un problema similar.