回答:
出力はエラーよりも優れているため、最初に出力されます(1対2)。
>「goes to」の省略形です。左側が送信したいもので、右側が送信したい場所です。'where'は(ほとんど)常にファイルなので、
program > /dev/null 2>1
1という名前のファイルにリダイレクトします。したがって、アンパサンド(&)はファイルをファイル記述子に変更します。
残念ながら、私は自分のニーモニックに出会ったり開発したりしていませんが、* nixを初めて学んだとき、この論理的な方法がうまく機能することを発見しました。数回実行すると、2番目の性質になります。
stdoutファイル記述子1 stderrは2です。したがって、「エラー」は「出力」の前に来ます。
stdoutをstderr参照して参照するかを覚えるニーモニックです。
を&結び目として見ると役立つ場合があります:2の出力を取得するので2>、何をしたいのかを考えてください。2>&1
次の3つのオプションについて考えてみましょう。
program 2>1
program 2>1&
program 2>&1
最初はstderrをファイル名「1」に送信します。結局、bashはファイルにリダイレクトすることを期待しています。
2番目も同じファイルにリダイレクトしますがprogram、バックグラウンドで実行されます。つまり、末尾&が意味するはずです。
これは、ファイルハンドルへのリダイレクトに関してbashユニバースで意味をなす唯一のものとして、3番目の可能性を残します。
0、1、2のどれがどれであるかを覚える方法は?コンソールからコンピューターを実行することを考えてください。まず、何かを入力する必要があります(0 = stdin)。次に、出力が表示されます(1 = stdout)。最後に、何か問題が発生した場合にのみ、stderr(2)が表示されます。
壁紙に描いてください。
真剣に、これやその他の基本的なことは忘れていたので、開発したアプリと毎日使用するアプリに簡単なヒントメニューを追加しました。試してみるか、gnoteのようなものを使用してメモをとってください。
bashシェルに関しては、何が起きているのかを理解することが最良の記憶方法です。
コマンドを正しく取得する方法を覚えているだけでよい場合は、試してみてください
program > /results 2> /results
それは素晴らしいことであり、明らかなことであり、覚えやすいものです。すなわち
1 STDOUTは /results2STDERRも起こっている直接に/results問題は、これが期待どおりに機能しないことです。以下を考慮してください。
ファイル: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
そして、コマンドを実行します
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
それから
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
ここで何が起こったの?
私の理解は、STDERRを直接ファイルに向けるリダイレクト/tmp/resultsと、その性質のために>2つのことを行うbashセットアップです
>>しません。したがって、この場合はSTDERRは、/tmp/resultsSTDOUTの出力をオーバーライドする先頭に直接挿入します。
注:>>追加に使用したことがある場合は、おそらくこの構文で回避できます。
ただし、STDERRをファイルに直接リダイレクトするのではなく、STDERRの出力をSTDOUTストリームにマージして、衝突が発生しないようにする必要があります。
オペレーター2>&1operator を使用してこれを実現します
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
これ&により、bashは、指定されたファイル1および1ファイル記述子と区別でき ます。
私には、ステートメント2>&1自体が何が起こっているのかを正確に説明しています-STDERRはSTDOUT自体にリダイレクトされています-そして/tmp/results、STDOUTがポイントされているので(ほとんど副作用として)終わるだけです。
多くのガイドが主張するものとは対照的に、2>&1STDOUTが指し示されている場所にSTDERRを送信します。それが本当だった場合-あなたはまだ上書きの問題を抱えているでしょう。
詳細については、http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirectionを参照してください。
program 1> /dev/null 2>/dev/nullます。あなたが混在する必要がありますけれども、いくつかの時間stdoutとstderr複雑なコンパイルプロセスからの出力のようにファイルにリダイレクトされている-実際に何が起こっているかを確認するために一緒に。その場合、私はそれをグーグルで