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

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

Tengo el siguiente comando:

find / -name libGL.so.1

Lo que devuelve muchas líneas con "Permiso denegado". Quiero excluir esas 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 filtra las líneas con Permission denied. Probé muchas variaciones, revisé los tutoriales de grep, pero no puedo resolver el problema. ¿Alguna sugerencia?

Respuesta1

Eso no tiene nada que ver grep, se debe a que la canalización |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(redireccionar la secuencia cuyo descriptor de archivo es 2a la secuencia cuyo descriptor de archivo es 1) para 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 descartarlo 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, probablemente notarás esta propaganda:

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

Así que también puedes usar esta construcción si quieres unir STDERR y STDOUT:

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

Respuesta2

Tu comando debería ser:

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

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

Respuesta3

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

Puedes redirigir stderr por completo con

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

Respuesta4

¿Has intentado llamar al comando consudo?

sudo find / -name libGL.so.1

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

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

Más ideasaquí, ¡buena suerte!

información relacionada