¿Por qué grep no usa tuberías aquí?

18

Tengo el siguiente comando:

find / -name libGL.so.1

Que devuelve muchas líneas con "Permiso denegado". Quiero excluir tales líneas, así que agregué lo siguiente:

find / -name libGL.so.1 | grep -v 'denied'

Pero el resultado es el mismo: my grep -v 'denied'no está filtrando las líneas con Permission denied. He intentado muchas variaciones, revisé los tutoriales grep, pero no puedo resolver el problema. ¿Alguna sugerencia?

modulitos
fuente

Respuestas:

43

Eso no tiene nada que ver grep, es porque la tubería |redirige el flujo de salida estándar stdoutmientras que los Permission deniedmensajes están en el flujo de error estándar stderr. Puede lograr el resultado que desea combinando las secuencias usando 2>&1(redirigir la secuencia cuyo descriptor de archivo es 2a la secuencia cuyo descriptor de archivo es 1) de modo que stderrademás stdoutse canalice a la entrada del comando grep

find / -name libGL.so.1 2>&1 | grep -v 'denied'

pero sería más habitual simplemente descartar stderrpor completo redirigiéndolo a/dev/null

find / -name libGL.so.1 2>/dev/null

Usando | & en lugar de 2> & 1 |

Si echas un vistazo a la página de manual de Bash, es probable que notes esta propaganda:

Si |&se usa, el error estándar de comando se conecta a la entrada estándar de command2 a través de la tubería; es taquigrafía para 2>&1 |.

Por lo tanto, también puede usar esta construcción si desea unir STDERR y STDOUT:

find / -name libGL.so.1 |& grep -v 'denied'
conductor de acero
fuente
3
Nota adicional sobre cómo combinarlos: si por alguna extraña razón existe el archivo en /foo/bar/denied/libGL.so.1, combinar stdouty stderr luego filtrar ocultaría el resultado
Izkata
5

Su comando debe ser:

find / -name libGL.so.1 2>/dev/null

Find se queja de los permisos en el error estándar (fd2). Para eliminar esas líneas, redirija (>) el estándar al depósito de bits (/ dev / null).

raíz de serpiente
fuente
4

Las líneas de "permiso denegado" van a la secuencia stderr (error estándar), pero está canalizando stdout (salida estándar) a través de grep.

Puede redirigir stderr completamente con

find / -name libGL.so.1 2> /dev/null
Andrew McGuinness
fuente
2

¿Has intentado llamar al comando con sudo ?

sudo find / -name libGL.so.1

Si aún muestra el mensaje, use la redirección ya mencionada de stderr (fd = 2) a nirvana (/ dev / null) :

sudo find / -name libGL.so.1 2> /dev/null

Más ideas aquí , ¡buena suerte!

manamana
fuente