Por que esse comando grep não funciona?

24

Quando tento usar o grep desta maneira:

service --status-all | grep network

Ele ainda lista todos os serviços, embora eu o tenha direcionado greppara restringi-lo apenas à cadeia de "rede"


Depois do ocorrido:

Observei este artigo que explica por que o comando se comporta dessa maneira, é disso que eu gosto no Linux, sempre há um bom motivo, mas não é necessário intuitivo

Meer Borg
fonte

Respostas:

41

Experimentar:

service --status-all |& grep network

Os aplicativos de linha de comando podem imprimir em dois fluxos de texto conhecidos como saída padrão (stdout) e erro padrão (stderr). Por padrão, o terminal apenas exibe a saída para ambos de forma idêntica.

Stdout é dado o número 1, e stderr é dado o número 2. Por padrão, operadores de redirecionamento, como >, |e <se aplicam apenas a stdout, número 1.

|&canaliza stdout e stderr juntos para o processo no fluxo de entrada padrão (stdin) da direita, que faz o greptrabalho conforme o esperado.

Não sei por que a service --status-allimpressão é feita no stderr aqui, mas, em geral, ter um fluxo stderr separado é muito útil, pois permite ver erros mesmo quando o stdout é silenciado.

Flimm
fonte
Obrigado pela resposta, parece que isso gerou muito interesse. Acho que não fui o único com esse problema.
Meer Borg
4

Você precisa redirecionar o fluxo de erro padrão ( 2) para a saída padrão ( 1):

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

O operador >normalmente redireciona para o arquivo (por exemplo 2>/tmp/file). Para redirecionar para outro fluxo usando o descritor , ele precisa ser precedido por &(observe que não há espaços entre os caracteres).

Paweł Nadolski
fonte