Dlaczego to polecenie grep nie działa?


24

Kiedy próbuję użyć grep w ten sposób:

service --status-all | grep network

Nadal wyświetla listę wszystkich usług, mimo że wpakowałem go w grepcelu ograniczenia tylko do ciągu „sieciowego”


Po fakcie:

Zauważyłem ten artykuł, który wyjaśnia, dlaczego polecenie zachowuje się w ten sposób, to właśnie podoba mi się w Linuksie, zawsze jest dobry powód, ale niekoniecznie intuicyjny

Odpowiedzi:


41

Próbować:

service --status-all |& grep network

Aplikacje wiersza polecenia mogą drukować na dwóch strumieniach tekstu znanych jako standardowe wyjście ( standardowe wyjście) i standardowy błąd (standardowe). Domyślnie terminal wyświetla identycznie dane wyjściowe dla obu.

Stdout jest podany numer 1, a stderr jest podany numer 2. Domyślnie, operatorów przekierowania, jak >, |i <odnoszą się tylko do stdout, numer 1.

|&potokuje stdout i stderr razem do procesu na standardowym strumieniu wejściowym (stdin) po prawej stronie, co zapewnia greppracę zgodnie z oczekiwaniami.

Nie wiem, dlaczego tutaj service --status-alljest drukowane do stderr, ale ogólnie rzecz biorąc, oddzielny strumień stderr jest bardzo przydatny, ponieważ pozwala zobaczyć błędy, nawet gdy stdout jest wyciszony.


Dzięki za odpowiedź, wydaje się, że wzbudziło to duże zainteresowanie. Myślę, że nie tylko ja miałem ten problem.
Meer Borg,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.