Pourquoi cette commande grep ne fonctionne-t-elle pas?

24

Lorsque j'essaie d'utiliser grep de cette façon:

service --status-all | grep network

Il répertorie toujours tous les services même si je l'ai canalisé greppour le restreindre à la chaîne "réseau" uniquement


Après coup:

Remarqué cet article qui explique pourquoi la commande se comporte de cette façon, c'est ce que j'aime à propos de Linux, il y a toujours une bonne raison, mais pas nécessairement intuitive

Meer Borg
la source

Réponses:

41

Essayer:

service --status-all |& grep network

Les applications en ligne de commande peuvent imprimer sur deux flux de texte appelés sortie standard (stdout) et erreur standard (stderr). Par défaut, le terminal affiche simplement la sortie pour les deux de manière identique.

Stdout reçoit le numéro 1, et stderr reçoit le numéro 2. Par défaut, les opérateurs de redirection, comme >, |et <ne s'appliquent qu'aux stdout, numéro 1.

|&dirige à la fois stdout et stderr vers le processus sur le flux d'entrée standard (stdin) de droite, ce qui grepfonctionne comme prévu.

Je ne sais pas pourquoi l' service --status-allimpression sur stderr ici, mais en général, avoir un flux stderr séparé est très utile, car il vous permet de voir les erreurs même lorsque stdout est désactivé.

Flimm
la source
Merci pour la réponse, cela semble avoir suscité beaucoup d'intérêt. Je suppose donc que je n'étais pas le seul à avoir ce problème.
Meer Borg
4

Vous devez rediriger le flux d'erreur standard ( 2) vers la sortie standard ( 1):

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

L'opérateur >redirige normalement vers un fichier (par exemple 2>/tmp/file). Pour rediriger vers un autre flux à l'aide du descripteur , il doit être précédé de &(notez qu'il n'y a pas d'espaces entre les caractères).

Paweł Nadolski
la source