ここでパイプを使用した grep が機能しないのはなぜですか?

ここでパイプを使用した grep が機能しないのはなぜですか?

次のコマンドがあります:

find / -name libGL.so.1

これにより、「Permission denied」という行が多数返されます。このような行を除外したいので、次の行を追加しました。

find / -name libGL.so.1 | grep -v 'denied'

しかし、出力は同じです。my はgrep -v 'denied'の行をフィルタリングしていませんPermission denied。さまざまなバリエーションを試し、grep チュートリアルを確認しましたが、問題がわかりません。何か提案はありますか?

答え1

これは とは何の関係もありませんgrep。パイプは|標準出力ストリームをリダイレクトしますstdoutが、Permission deniedメッセージは標準エラーストリームにあるからです。 (ファイル記述子が であるストリームを、ファイル記述子が であるストリームにリダイレクトする)stderrを使用してストリームを組み合わせることで、必要な結果を得ることができます。これにより、 がgrep コマンドの入力にパイプされます。2>&121stderrstdout

find / -name libGL.so.1 2>&1 | grep -v 'denied'

stderrしかし、それをリダイレクトして完全に破棄する方が一般的です。/dev/null

find / -name libGL.so.1 2>/dev/null

2>&1 | の代わりに |& を使用する

Bash のマニュアルページを見ると、次のような説明があることに気づくでしょう。

が使用される場合|&、コマンドの標準エラーはパイプを介してコマンド2の標準入力に接続されます。これは の省略形です2>&1 |

したがって、STDERR と STDOUT を結合する場合も、この構造を使用できます。

find / -name libGL.so.1 |& grep -v 'denied'

答え2

コマンドは次のようになります:

find / -name libGL.so.1 2>/dev/null

Find は標準エラー (fd2) の権限についてエラーを出力します。これらの行を削除するには、標準出力をビット バケット (/dev/null) にリダイレクト (>) します。

答え3

「permission denied」行は stderr (標準エラー) ストリームに送られますが、grep を介して stdout (標準出力) をパイプしています。

stderrを完全にリダイレクトするには、

find / -name libGL.so.1 2> /dev/null

答え4

コマンドを呼び出してみたことはありますか?須藤?

sudo find / -name libGL.so.1

それでもメッセージが表示される場合は、すでに述べたリダイレクトを使用してください。stderr (fd=2) から nirvana (/dev/null) へ:

sudo find / -name libGL.so.1 2> /dev/null

その他のアイデアここ、 幸運を!

関連情報