Это не имеет ничего общего 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 |
Если вы посмотрите на справочную страницу Bash, вы, скорее всего, заметите этот всплеск:
Если |&используется, стандартная ошибка команды связана со стандартным вводом command2 через канал; это сокращение для 2>&1 |.
Таким образом, вы также можете использовать эту конструкцию, если хотите присоединиться к STDERR и STDOUT:
find / -name libGL.so.1 |& grep -v 'denied'
/foo/bar/denied/libGL.so.1, объединение,stdoutаstderrзатем фильтрация