Чому тут не спрацьовує труба?


18

У мене є така команда:

find / -name libGL.so.1

Який повертає безліч рядків із "Дозволом відмовлено". Я хочу виключити такі рядки, тому я додав наступне:

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

Але вихід той самий - мій grep -v 'denied'не фільтрує лінії з Permission denied. Я спробував багато варіацій, переглянув підручні програми, але не можу зрозуміти проблему. Будь-які пропозиції?

Відповіді:


44

Це нічого спільного 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 |

Якщо ви подивитеся на сторінку чоловіка Баша, ви, ймовірно, помітите це розмиття:

Якщо |&використовується, стандартна помилка команди підключається до стандартного вводу command2 через трубу; це скорочення 2>&1 |.

Таким чином, ви також можете використовувати цю конструкцію, якщо ви хочете приєднатись до STDERR та STDOUT:

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

3
Додаткова примітка про об'єднання їх: Якщо з якоїсь - дивної причини файл існує в /foo/bar/denied/libGL.so.1, комбінуючи stdoutі stderr потім фільтрування б приховати результат
Izkata

5

Вашою командою має бути:

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

Find скаржиться на дозволи на стандартну помилку (fd2). Щоб усунути ці рядки, перенаправляйте (>) стандарт на бітове відро ((dev / null)).


4

Рядки "відмовлено в дозволі" переходять до потоку stderr (стандартна помилка), але ви прокладаєте stdout (стандартний вихід) через grep.

Ви можете повністю переадресувати на stderr повністю

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

2

Ви намагалися викликати команду за допомогою sudo ?

sudo find / -name libGL.so.1

Якщо воно все ще показує повідомлення, використовуйте вже згадане переспрямування stderr (fd = 2) на nirvana (/ dev / null) :

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

Більше ідей тут , удачі!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.