ここでgrepがパイプで動作しないのはなぜですか?

ここでgrepがパイプで動作しないのはなぜですか?

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

find / -name libGL.so.1

「許可拒否」を含む多くの行を返します。この行を除外したかったので、以下を追加しました。

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

ただし、出力は同じです。 mygrep -v 'denied'Permission denied。さまざまなバリエーションを試してgrepチュートリアルを見てみましたが、問題を特定できませんでした。どんな提案がありますか?

ベストアンサー1

これは関係ありませんgrep。パイプは|標準出力ストリームをリダイレクトしますstdoutが、Permission deniedメッセージは標準エラーストリームにあるためですstderr。入力をgrepコマンドにパイプするために、結合されたストリーム2>&1(ファイルディスクリプタを持つストリームを2ファイルディスクリプタを持つストリームにリダイレクト)を使用して必要なものを取得できます。1stderrstdout

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

しかし、より一般的なアプローチは、直接stderrリダイレクトして完全に削除することです。/dev/null

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

2>&1 |代わりに|&を使用してください。

Bashのマニュアルページを見ると、次の紹介を見ることができます。

使用すると、|&コマンドの標準エラーはcommand2の標準入力にパイプされます2>&1 |

したがって、STDERRとSTDOUTを接続する場合は、次の構文を使用することもできます。

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

おすすめ記事