Warum funktioniert die Verwendung von Pipe durch grep hier nicht?

Warum funktioniert die Verwendung von Pipe durch grep hier nicht?

Ich habe folgenden Befehl:

find / -name libGL.so.1

Das gibt viele Zeilen mit „Zugriff verweigert“ zurück. Ich möchte solche Zeilen ausschließen, also habe ich Folgendes hinzugefügt:

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

Aber die Ausgabe ist die gleiche – meins grep -v 'denied'filtert die Zeilen mit nicht heraus Permission denied. Ich habe viele Varianten ausprobiert, mir Grep-Tutorials angesehen, aber ich kann das Problem nicht herausfinden. Irgendwelche Vorschläge?

Antwort1

Das hat nichts damit zu tun grep- es liegt daran, dass die Pipe |den Standardausgabestream umleitet stdout, während die Permission deniedNachrichten im Standardfehlerstream sind stderr. Sie könnten das gewünschte Ergebnis erreichen, indem Sie die Streams kombinieren, indem Sie 2>&1(den Stream, dessen Dateideskriptor ist, 2zum Stream, dessen Dateideskriptor ist 1) verwenden, sodass stderrsowohl als auch stdoutals Eingabe des grep-Befehls weitergeleitet werden .

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

aber es wäre üblicher, es einfach stderrganz zu verwerfen, indem man es umleitet auf/dev/null

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

Verwenden von |& anstelle von 2>&1 |

Wenn Sie einen Blick auf die Manpage von Bash werfen, werden Sie wahrscheinlich diesen kurzen Text bemerken:

Wenn |&verwendet wird, wird der Standardfehler des Befehls über die Pipe mit der Standardeingabe von Befehl2 verbunden. Es ist eine Abkürzung für 2>&1 |.

Sie können diese Konstruktion also auch verwenden, wenn Sie STDERR und STDOUT verbinden möchten:

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

Antwort2

Ihr Befehl sollte sein:

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

Find beschwert sich über Berechtigungen für Standardfehler (fd2). Um diese Zeilen zu beseitigen, leiten Sie (>) Standard zum Bit-Bucket (/dev/null) um.

Antwort3

Die Zeilen mit dem Hinweis „Zugriff verweigert“ werden an den Stderr-Stream (Standardfehler) gesendet, Sie leiten jedoch Stdout (Standardausgabe) durch Grep weiter.

Sie können stderr vollständig umleiten mit

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

Antwort4

Haben Sie versucht, den Befehl mit aufzurufensudo?

sudo find / -name libGL.so.1

Wenn die Meldung immer noch angezeigt wird, verwenden Sie die bereits erwähnte Weiterleitung vonstderr (fd=2) nach Nirvana (/dev/null):

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

Ebenfalls zu sehenHier, viel Glück!

verwandte Informationen