Це нічого спільного grep
- це тому, що труба |
перенаправляє стандартний вихідний потік, stdout
тоді як Permission denied
повідомлення перебувають у стандартному потоці помилок stderr
. Ви можете досягти бажаного результату, комбінуючи потоки, використовуючи 2>&1
(перенаправляйте потік, дескриптор якого файлу призначений 2
на потік, дескриптор якого файлу 1
), щоб він stderr
також stdout
потрапляв на вхід команди grep
find / -name libGL.so.1 2>&1 | grep -v 'denied'
але було б звичніше просто відмовитися stderr
взагалі, перенаправляючи його на/dev/null
find / -name libGL.so.1 2>/dev/null
Використання | & замість 2> & 1 |
Якщо ви подивитеся на сторінку чоловіка Баша, ви, ймовірно, помітите це розмиття:
Якщо |&
використовується, стандартна помилка команди підключається до стандартного вводу command2 через трубу; це скорочення 2>&1 |
.
Таким чином, ви також можете використовувати цю конструкцію, якщо ви хочете приєднатись до STDERR та STDOUT:
find / -name libGL.so.1 |& grep -v 'denied'
/foo/bar/denied/libGL.so.1
, комбінуючиstdout
іstderr
потім фільтрування б приховати результат