STDERRを/ dev / nullにリダイレクトするのはなぜですか?


28

これは私には意味がありません。

wibble > /dev/null 2>&1

これが次のようなものである場合、より意味があると思います。

wibble 2>&1 > /dev/null

言い換えると

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

コマンドリダイレクトの順序の背後にある考え方は何xxx > /dev/null 2>1ですか?


6
この説明も役立つかもしれません。
rozcietrzewiacz

おかげで、実際に私の質問を正確に説明すること@rozcietzewiacz
whoamiは

1
グレッグのWikiのそのページの中央にはすばらしい文章があります。まだ。心配しないでください-それは非常に一般的な誤解であり、あなたは一人ではありません。…多くの人は2>&1、2つのFD を何らかの形で「結合」または「結合」または「結婚」し、一方のFDに対する(その後の)変更が他方のFDに変わると考えています。これは事実ではありません。」
Gマンは言う「モニカーの復活」

回答:


40

リダイレクトは左から右に処理されます。もしあなたがそうするなら

2>&1 1> /dev/null

最初のリダイレクトは、その時点stderrstdoutポイントするストリームを指します(これは本質的にttyです)。のstderrエイリアスは作成しませんstdout

その後stdout、ビットバケットにリダイレクトされます。stdoutリダイレクトは、以前には影響しませんstderrリダイレクトを。stderrまだttyを指します。

そう:

ls file_that_doesnt_exist 2>&1 1> /dev/null

端末にエラーメッセージのみを出力します。

bashリダイレクトドキュメントページは、明示的にこれに言及しています:

リダイレクトの順序は重要であることに注意してください。たとえば、コマンド

          ls > dirlist 2>&1

コマンドが標準出力と標準エラーの両方をファイルdirlistに送信します。

          ls 2>&1 > dirlist

標準出力がdirlistにリダイレクトされる前に標準エラーが標準出力から複製されたため、標準出力のみをファイルdirlist に送信します。


3
イェイは私の難問を解決します。私はまだ論理的に混乱していると思います。しかし、私は面白いです、同じページ上の別の部分が見つかった&>/dev/nullと同じ意味である/dev/null 2>&1
whoamiは

1
あなたが話しているページは、Bashリファレンスマニュアルの一部であることを強調する必要があります。明らかに、bashについて説明しています。そこbashの異なる世界の他のシェルは、であり、&>かつ>&(文脈で使用されていないとき2>&1>&2、など)はbash-ISMSあるとされない標準。移植したいシェルスクリプトでは使用しないでください。
G-Manが「Reinstate Monica」と言う
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.