Когда я пытаюсь использовать grep таким образом:
service --status-all | grep network
Он по-прежнему перечисляет все сервисы, даже несмотря на то, что я передал его в grep
, чтобы ограничить его только «сетевой» строкой
После факта:
Обратите внимание на эту статью , которая объясняет, почему команда ведет себя таким образом, это то, что мне нравится в linux, всегда есть веская причина, но не обязательно интуитивно понятная
blockquote>
Попробуйте:
service --status-all |& grep network
Приложения командной строки могут печатать в два текстовых потока, известные как стандартный выход (стандартный вывод) и стандартная ошибка (стандартный вывод). По умолчанию терминал просто отображает вывод для обоих идентично.
Stdout - номер 1, а stderr - номер 2. По умолчанию операторы перенаправления, такие как >
, |
и <
, применяются только к stdout, номер 1.
|&
направляет и stdout, и stderr вместе в процесс на стандартном входном потоке справа (stdin), который заставляет grep
работать, как вы ожидали.
Я не знаю, почему service --status-all
печатает в stderr здесь, но в целом наличие отдельного потока stderr очень полезно, так как позволяет видеть ошибки, даже когда stdout отключен.
Необходимо перенаправить стандартный поток ошибок (2
) на стандартный выход (1
):
service --status-all 2>&1 | grep network
Оператор >
в обычном режиме перенаправляет в файл (например, 2>/tmp/file
). Чтобы перенаправить на другой поток с использованием дескриптора , ему должен предшествовать &
(обратите внимание, что между символами нет пробелов).