¿Por qué este comando grep no funciona?

24

Cuando trato de usar grep de esta manera:

service --status-all | grep network

Todavía enumera todos los servicios, aunque lo conecté greppara restringirlo a la cadena de "red" solamente


Después del hecho:

Noté este artículo que explica por qué el comando se comporta de esta manera, eso es lo que me gusta de Linux, siempre hay una buena razón, pero no necesariamente intuitiva

Meer Borg
fuente

Respuestas:

41

Tratar:

service --status-all |& grep network

Las aplicaciones de línea de comandos pueden imprimir en dos secuencias de texto conocidas como salida estándar (stdout) y error estándar (stderr). Por defecto, el terminal solo muestra la salida para ambos de forma idéntica.

Stdout recibe el número 1, y stderr recibe el número 2. Por defecto, los operadores de redirección, como >, |y se <aplican solo a stdout, número 1.

|&canaliza tanto stdout como stderr juntos al proceso en la secuencia de entrada estándar (stdin) de la derecha, lo que hace que grepfuncione como esperaba.

No sé por qué service --status-allestá imprimiendo stderr aquí, pero en general, tener una secuencia stderr separada es muy útil, ya que le permite ver errores incluso cuando stdout está silenciado.

Flimm
fuente
Gracias por la respuesta, parece que esto ha generado mucho interés. Así que supongo que no fui el único con este problema.
Meer Borg
4

Debe redirigir la secuencia de error estándar ( 2) a la salida estándar ( 1):

service --status-all 2>&1 | grep network

El operador >normalmente redirige al archivo (por ejemplo 2>/tmp/file). Para redirigir a otra secuencia usando el descriptor , debe ir precedido de &(tenga en cuenta que no hay espacios entre los caracteres).

Paweł Nadolski
fuente