Почему эта команда grep не работает?

Когда я пытаюсь использовать grep таким образом:

service --status-all | grep network

Он по-прежнему перечисляет все сервисы, даже несмотря на то, что я передал его в grep, чтобы ограничить его только «сетевой» строкой


После факта:

Обратите внимание на эту статью , которая объясняет, почему команда ведет себя таким образом, это то, что мне нравится в linux, всегда есть веская причина, но не обязательно интуитивно понятная

24
задан 13 April 2017 в 15:24

2 ответа

Попробуйте:

service --status-all |& grep network

Приложения командной строки могут печатать в два текстовых потока, известные как стандартный выход (стандартный вывод) и стандартная ошибка (стандартный вывод). По умолчанию терминал просто отображает вывод для обоих идентично.

Stdout - номер 1, а stderr - номер 2. По умолчанию операторы перенаправления, такие как >, | и <, применяются только к stdout, номер 1.

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

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

0
ответ дан 13 April 2017 в 15:24

Необходимо перенаправить стандартный поток ошибок (2) на стандартный выход (1):

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

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

0
ответ дан 13 April 2017 в 15:24

Другие вопросы по тегам:

Похожие вопросы: