0 、 1 、 2 が STDIN 、 STDOUT 、および STDERR ファイル記述子であることはわかっています。リダイレクトを理解しようとしています。「>」はファイルへのダンプを意味します 「>>」は追加を意味します
しかし、'>&' は何をするのでしょうか? また、次のコマンドの段階的なプロセスは何ですか?
command > file 2>&1
command > file 2<&1
0 、 1 、 2 が STDIN 、 STDOUT 、および STDERR ファイル記述子であることはわかっています。リダイレクトを理解しようとしています。「>」はファイルへのダンプを意味します 「>>」は追加を意味します
しかし、'>&' は何をするのでしょうか? また、次のコマンドの段階的なプロセスは何ですか?
command > file 2>&1
command > file 2<&1
それを段階的に分析してみましょう:
>placeは、標準出力を再度開いて、書き込みを開始することを意味しplaceます。これは、書き込み用に開かれるファイル名です。これは典型的なリダイレクトです。
N>place任意のファイル記述子nに対して同じことを行います。たとえば2>place、標準エラーであるファイル記述子2をにリダイレクトしますplace。1>placeと同じ>placeです。
placeが特別な構文で記述されている場合&N、ファイル名ではなく既存のファイル記述子番号として扱われます。したがって、>&2両方1>&2とも、標準出力を再度開いて標準エラーに書き込むことを意味し、2>&1その逆です。
場所<と記述子が読み取り用に開かれ、記号の左側のファイル記述子がデフォルトで0になっていることを除いて、入力についてもまったく同じことが言えます。これは標準入力を表します。2<&1「ファイル記述子2を再度開いて読み取り、将来の読み取りが実際にファイル記述子1から読み取られるようにする」ことを意味します。ファイル記述子1と2の両方が書き込み可能であるため、これは通常のプログラムでは意味がありません。
NUMBER1>&NUMBER2ファイル記述子NUMBER2にファイル記述子NUMBER1を割り当てることを意味します。
つまり、を実行しdup2 (NUMBER2, NUMBER1)ます。
command > file 2>&1
Bashはコマンドラインを処理し、最初にリダイレクトを検出し、書き込み先の>filestdoutを変更しfile、次に処理を続行して検索2>&1し、stdoutに書き込まれるようにstderrを変更します(fileこの時点で)。
command > file 2<&1
これは同じですが、2<&1stderrをreadstdoutからにリダイレクトします。stderrから読み取る人はいないため、この2番目のリダイレクトは通常効果がありません。
ただし、bashは、この特殊なケースをと同じように処理するため2>&1、を実行しdup2 (1, 2)ます。
2>&1行くSTDERRのと同じ場所にリダイレクトすることを意味します。STDOUTそれが役立つ1つの例は、grepこれで通常は機能STDOUTするものであり、次のように機能しSTDOUTますSTDERR。
app 2>&1 | grep hello