このgrepコマンドが機能しないのはなぜですか?


24

この方法でgrepを使用しようとすると:

service --status-all | grep network

grep「ネットワーク」文字列のみに制限するためにパイプしたにもかかわらず、すべてのサービスがリストされます。


事後に:

コマンドがこのように動作する理由を説明するこの記事に注意してください、それはLinuxについて私が好きなことです、常に正当な理由がありますが、必ずしも直感的ではありません

回答:


41

試してください:

service --status-all |& grep network

コマンドラインアプリケーションは、標準出力(stdout)および標準エラー(stderr)として知られる2つのテキストストリームに出力できます。デフォルトでは、端末は両方の出力をまったく同じように表示します。

stdoutには番号1が与えられ、stderrには番号2が与えられます。デフォルトでは、リダイレクト演算子は、など>|あり<、stdoutにのみ適用されます。

|&stdoutとstderrの両方を右の標準入力(stdin)ストリームのプロセスにパイプgrepします。これにより、期待どおりに動作します。

service --status-allここでstderrに出力する理由はわかりませんが、一般に、stdoutが無音の場合でもエラーが表示されるため、独立したstderrストリームを持つことは非常に便利です。


答えをありがとう、これは多くの関心を生み出したようです。したがって、この問題を抱えているのは私だけではなかったと思います。
ミーアボルグ

4

標準エラーストリーム2)を標準出力1)にリダイレクトする必要があります

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

オペレーター>は通常、ファイルにリダイレクトします(例:)2>/tmp/filedescriptorを使用して他のストリームにリダイレクトするには、その前に&(文字間にスペースがないことに注意してください)必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.