Warum grept man hier nicht mit Rohrleitungen?

18

Ich habe den folgenden Befehl:

find / -name libGL.so.1

Was viele Zeilen mit "Permission denied" zurückgibt. Ich möchte solche Zeilen ausschließen und habe Folgendes hinzugefügt:

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

Aber die Ausgabe ist die gleiche - meine grep -v 'denied'filtert nicht die Zeilen mit Permission denied. Ich habe viele Variationen ausprobiert und grep Tutorials durchgesehen, kann das Problem aber nicht herausfinden. Irgendwelche Vorschläge?

modulitos
quelle

Antworten:

43

Das hat nichts damit zu tun grep- es liegt daran, dass die Pipe |den Standardausgabestream umleitet, stdoutwährend sich die Permission deniedNachrichten im Standardfehlerstream befinden stderr. Sie können das gewünschte Ergebnis erzielen, indem Sie die Streams mit 2>&1(umleiten des Streams, dessen Dateideskriptor 2auf den Stream, dessen Dateideskriptor auf den Stream verweist 1) kombinieren, sodass der Stream stderrauch stdoutan die Eingabe des Befehls grep weitergeleitet wird

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

es wäre jedoch üblicher, es einfach zu verwerfen, stderrindem man es zu umleitet/dev/null

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

Verwenden Sie | & anstelle von 2> & 1 |

Wenn Sie sich die Bash-Manpage ansehen, werden Sie wahrscheinlich diesen Klappentext bemerken:

Wenn |&verwendet, 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 dieses Konstrukt also auch verwenden, wenn Sie sich STDERR und STDOUT anschließen möchten:

find / -name libGL.so.1 |& grep -v 'denied'
Stahlfahrer
quelle
3
Zusätzlicher Hinweis zum Kombinieren: Wenn die Datei aus einem bizarren Grund unter existiert /foo/bar/denied/libGL.so.1, wird das Ergebnis durch Kombinieren stdoutund stderr anschließendes Filtern
ausgeblendet
5

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 entfernen, leiten Sie (>) standardmäßig in den Bit-Bucket (/ dev / null) um.

snakeroot
quelle
4

Die Zeilen mit "Berechtigung verweigert" gehen an den Stream stderr (Standardfehler), aber Sie leiten stdout (Standardausgang) durch grep.

Sie können stderr vollständig mit umleiten

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

Haben Sie versucht, den Befehl mit sudo aufzurufen ?

sudo find / -name libGL.so.1

Wenn die Meldung weiterhin angezeigt wird, verwenden Sie die bereits erwähnte Umleitung von stderr (fd = 2) nach nirvana (/ dev / null) :

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

Weitere Ideen hier , viel Glück!

Manamana
quelle