web-dev-qa-db-ja.com

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

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

find / -name libGL.so.1

「Permission denied」で多くの行を返します。そのような行を除外したいので、以下を追加しました:

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

しかし、出力は同じです-私のgrep -v 'denied'Permission deniedで行をフィルタリングしていません。私は多くのバリエーションを試し、grepチュートリアルを調べましたが、問題を理解できません。助言がありますか?

18
modulitos

それはgrepとは関係ありません-パイプ|が標準出力ストリームstdoutをリダイレクトするのに対し、Permission deniedメッセージは標準エラーストリームstderr2>&12のストリームをファイル記述子が1のストリームにリダイレクトする)を使用してストリームを組み合わせることにより、stderrおよびstdoutはgrepコマンドの入力にパイプされます

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

ただし、stderr/dev/nullにリダイレクトして完全に破棄するのが一般的です。

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

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

Bashのmanページを見ると、この言い回しに気付くでしょう:

|&を使用すると、コマンドの標準エラーがパイプを介してcommand2の標準入力に接続されます。 2>&1 |の短縮形です。

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

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

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

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

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

5
snakeroot

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

あなたはstderrを完全に離れてリダイレクトすることができます

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

Sudoでコマンドを呼び出してみましたか?

Sudo find / -name libGL.so.1

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

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

その他のアイデア ここ 、頑張ってください!

2
manamana