Pourquoi cette commande grep ne fonctionne pas?

23

Lorsque j'essaie d'utiliser grep de cette manière:

service --status-all | grep network

Il répertorie toujours tous les services, même si je l'ai transféré dans grep pour le restreindre uniquement à la chaîne "network"

  

Après le fait:

     

Article cela explique pourquoi la commande se comporte de cette façon, que c'est ce que j'aime chez linux, il y a toujours une bonne raison, mais pas nécessairement intuitive

    
posée Meer Borg 11.03.2013 - 10:38
la source

2 réponses

40

Essayez:

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 à l'identique.

Stdout reçoit le numéro 1 et stderr le numéro 2. Par défaut, les opérateurs de redirection, tels que > , | et < , s'appliquent uniquement à stdout, numéro 1.

|& redirige tous les deux stdout et stderr vers le processus sur le flux d'entrée standard (stdin), ce qui fait que grep fonctionne comme prévu.

Je ne sais pas pourquoi service --status-all imprime 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 la sortie standard est désactivée.

    
réponse donnée Flimm 11.03.2013 - 10:43
la source
4

Vous devez rediriger le flux d’erreur standard ( 2 ) vers 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'espace entre les caractères).

    
réponse donnée Paweł Nadolski 14.03.2013 - 21:44
la source

Lire d'autres questions sur les étiquettes