次のコマンドがあります:
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>&1
2
1
stderr
stdout
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
その他のアイデアここ、 幸運を!