Pourquoi grep n'utilise-t-il pas le tuyau ici?

18

J'ai la commande suivante:

find / -name libGL.so.1

Ce qui renvoie beaucoup de lignes avec "Autorisation refusée". Je souhaite exclure ces lignes, j'ai donc ajouté ce qui suit:

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

Mais la sortie est la même - ma grep -v 'denied'ne filtre pas les lignes avec Permission denied. J'ai essayé de nombreuses variantes, regardé les tutoriels grep, mais je ne peux pas comprendre le problème. Aucune suggestion?

modulitos
la source

Réponses:

43

Cela n'a rien à voir grep- c'est parce que le canal |redirige le flux de sortie standard stdouttandis que les Permission deniedmessages sont dans le flux d'erreur standard stderr. Vous pouvez obtenir le résultat souhaité en combinant les flux à l'aide de 2>&1(rediriger le flux dont le descripteur de fichier est 2vers le flux dont le descripteur de fichier est 1) de manière à ce stderrqu'il stdoutsoit acheminé vers l'entrée de la commande grep

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

mais il serait plus habituel de tout simplement éliminer stderrcomplètement en le redirigeant vers/dev/null

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

Utilisation de | & au lieu de 2> & 1 |

Si vous jetez un œil à la page de manuel de Bash, vous remarquerez probablement ce texte de présentation:

Si |&est utilisé, l'erreur standard de commande est connectée à l'entrée standard de command2 via le tuyau; c'est un raccourci pour 2>&1 |.

Vous pouvez donc également utiliser cette construction si vous souhaitez joindre STDERR et STDOUT:

find / -name libGL.so.1 |& grep -v 'denied'
tournevis
la source
3
Note supplémentaire sur les combinant: Si pour une raison bizarre le fichier existe à /foo/bar/denied/libGL.so.1, la combinaison stdoutet stderr puis le filtrage cacherait le résultat
Izkata
5

Votre commande doit être:

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

Find se plaint des autorisations sur l'erreur standard (fd2). Afin d'éliminer ces lignes, redirigez (>) la norme vers le compartiment de bits (/ dev / null).

snakeroot
la source
4

Les lignes "permission refusée" vont au flux stderr (erreur standard), mais vous dirigez stdout (sortie standard) via grep.

Vous pouvez rediriger stderr entièrement avec

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

Avez-vous essayé d'appeler la commande avec sudo ?

sudo find / -name libGL.so.1

S'il affiche toujours le message, utilisez la redirection déjà mentionnée de stderr (fd = 2) vers nirvana (/ dev / null) :

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

Plus d'idées ici , bonne chance!

manamana
la source