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

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

find / -name libGL.so.1 

Что возвращает много строк с «Permission denied». Я хочу исключить такие строки, поэтому добавил следующее:

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

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

Это не связано с 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, вы, скорее всего, заметите это сообщение:

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

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

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

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

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

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

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

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

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

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

 sudo find / -name libGL.so.1 

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

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

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