Чому ця команда grep не працює?


24

Коли я намагаюся використовувати grep таким чином:

service --status-all | grep network

Він все ще перераховує всі сервіси, хоча я переклав його на grepобмеження лише до рядка "мережа"


Після факту:

Помітивши цю статтю, яка пояснює, чому команда поводиться так, ось що мені подобається в Linux, завжди є вагома причина, але не потрібна інтуїтивна

Відповіді:


41

Спробуйте:

service --status-all |& grep network

Програми командного рядка можуть друкувати до двох текстових потоків, відомих як стандартний вихід (stdout) та стандартна помилка (stderr). За замовчуванням термінал просто відображає вихід для обох однаково.

Stdout надається число 1, а stderr - число 2. За замовчуванням оператори перенаправлення, як >, |і <застосовуються лише до stdout, номер 1.

|&труби як stdout, так і stderr разом до процесу на стандартному вхідному потоці (stdin) праворуч, що робить grepроботу так, як ви очікували.

Я не знаю, чому service --status-allтут друкувати на stderr, але загалом мати окремий потік stderr дуже корисно, оскільки він дозволяє бачити помилки, навіть коли stdout замовчується.


Дякую за відповідь, схоже, це викликало багато інтересу. Тож я гадаю, що я не був єдиним із цим питанням.
Meer Borg

4

Вам потрібно перенаправити стандартний потік помилок ( 2) на стандартний вихід ( 1):

service --status-all 2>&1 | grep network

Оператор >зазвичай переспрямовує файл (наприклад 2>/tmp/file). Щоб перенаправити на інший потік за допомогою дескриптора , йому потрібно передувати &(не помічайте пробілів між символами).

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