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

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

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

find / -name libGL.so.1

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

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

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

решение1

Это не имеет никакого отношения к делу 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, вы, вероятно, заметите эту аннотацию:

Если |&используется , стандартная ошибка команды command подключается к стандартному вводу command2 через канал; это сокращение для 2>&1 |.

Таким образом, вы также можете использовать эту конструкцию, если хотите объединить STDERR и STDOUT:

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

решение2

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

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

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

решение3

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

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

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

решение4

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

sudo find / -name libGL.so.1

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

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

Еще идеиздесь, удачи!

Связанный контент