Das hat nichts damit zu tun grep
- es liegt daran, dass die Pipe |
den Standardausgabestream umleitet, stdout
während sich die Permission denied
Nachrichten im Standardfehlerstream befinden stderr
. Sie können das gewünschte Ergebnis erzielen, indem Sie die Streams mit 2>&1
(umleiten des Streams, dessen Dateideskriptor 2
auf den Stream, dessen Dateideskriptor auf den Stream verweist 1
) kombinieren, sodass der Stream stderr
auch stdout
an 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, stderr
indem 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'
/foo/bar/denied/libGL.so.1
, wird das Ergebnis durch Kombinierenstdout
undstderr
anschließendes FilternIhr Befehl sollte sein:
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.
quelle
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
quelle
Haben Sie versucht, den Befehl mit sudo aufzurufen ?
Wenn die Meldung weiterhin angezeigt wird, verwenden Sie die bereits erwähnte Umleitung von stderr (fd = 2) nach nirvana (/ dev / null) :
Weitere Ideen hier , viel Glück!
quelle