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?

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'

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.


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

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!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.