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 denied
Nachrichten 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, 2
zum Stream, dessen Dateideskriptor ist 1
) verwenden, sodass stderr
sowohl als auch stdout
als Eingabe des grep-Befehls weitergeleitet werden .
find / -name libGL.so.1 2>&1 | grep -v 'denied'
aber es wäre üblicher, es einfach stderr
ganz 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ür2>&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!