У меня есть следующая команда:
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
Еще идеиздесь, удачи!