Почему grep не использует трубу здесь?

18

У меня есть следующая команда:

find / -name libGL.so.1

Который возвращает много строк с «Отказано в доступе». Я хочу исключить такие строки, поэтому я добавил следующее:

find / -name libGL.so.1 | grep -v 'denied'

Но вывод тот же - мой grep -v 'denied'не фильтрует строки с Permission denied. Я перепробовал много вариантов, просмотрел учебники по grep, но не могу понять проблему. Какие-либо предложения?

modulitos
источник

Ответы:

43

Это не имеет ничего общего 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'
steeldriver
источник
3
Дополнительное примечание по их объединению: если по какой-то причудливой причине файл существует в /foo/bar/denied/libGL.so.1, объединение, stdoutа stderr затем фильтрация
скрыли
5

Ваша команда должна быть:

find / -name libGL.so.1 2>/dev/null

Find жалуется на разрешения на стандартную ошибку (fd2). Чтобы исключить эти строки, перенаправьте стандарт (>) в область битов (/ dev / null).

SnakeRoot
источник
4

Строки «Отказано в разрешении» направляются в поток stderr (стандартная ошибка), но вы пропускаете stdout (стандартный вывод) через grep.

Вы можете полностью перенаправить stderr с помощью

find / -name libGL.so.1 2> /dev/null
Эндрю МакГиннесс
источник
2

Вы пытались вызвать команду с помощью sudo ?

sudo find / -name libGL.so.1

Если это все еще показывает сообщение, используйте уже упомянутый редирект stderr (fd = 2) в нирвану (/ dev / null) :

sudo find / -name libGL.so.1 2> /dev/null

Больше идей здесь , удачи!

Manamana
источник