2010-07-21 8 views
7

En Mathematica, es posible reutilizar la salida del comando anterior usando%.Usando salida de comandos previos en bash

¿Algo similar es posible para bash (o alguna otra carcasa)?

Por ejemplo, ejecuto una marca que da advertencias, pero quiero encontrar todas las advertencias. Por lo tanto, escriba

make | grep "warning" 

pero no soy capaz de ver la salida de la marca a continuación.

me gustaría escribir algo como esto en su lugar:

make 
% | grep "warning" 

Respuesta

8

Dado que la cantidad de la producción es indeterminada, que no tiene sentido para bash para almacenarlo para usted para volver a la pantalla. Pero existe una solución alternativa a su problema:

El comando tee le permite duplicar una secuencia de salida en un archivo. Así que si usted está dispuesto a utilizar un archivo de almacenamiento temporal, se puede hacer algo como esto:

make | tee output.txt 
grep "warning" output.txt 

Esta solución evita correr make dos veces, lo que podría ser (a) caro y (b) incompatibles: el segundo make puede estar haciendo menos trabajo que el primero porque algunos objetivos ya se hicieron la primera vez.

Nota: No he intentado esto. Es posible que deba jugar con la unión de las secuencias de error y de salida, o tal.

+0

derecho. en realidad no tiene sentido almacenar toda la producción. Sin embargo, el comando tee parece útil. Y lo probé. Funciona perfectamente. Gracias. – Harsh

2

No estoy seguro si el comando make envía advertencias a stderr pero sospecho que sí. intente esto

make 2&>1 |grep 'warning' 

redirigirá stderr a stdout.

También debe tener en cuenta que no puede grep nada que no va a stdout.

2

Si usa tee para duplicar el flujo de salida a/dev/stderr, no hay necesidad de un archivo temporal; Además, después de eso, puede filtrar la corriente stdout con sed para crear un archivo make_warning.log, todo en una línea de tubos de shell Unix.

make 2>&1 | tee /dev/stderr | \ 
    sed -E -n 's/(.*[Ww][Aa][Rr][Nn][Ii][Nn][Gg].*)/\1/p' > make_warning.log 
2

Intercambiar los stdout y stderr corrientes para iniciar sesión toda la stderr corriente:

make 3>&2 2>&1 1>&3 3>&- | tee /dev/stderr > stderr.log