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はコマンドラインを処理し、最初にリダイレクトを検出し、書き込み先の>file
stdoutを変更しfile
、次に処理を続行して検索2>&1
し、stdoutに書き込まれるようにstderrを変更します(file
この時点で)。
command > file 2<&1
これは同じですが、2<&1
stderrをread
stdoutからにリダイレクトします。stderrから読み取る人はいないため、この2番目のリダイレクトは通常効果がありません。
ただし、bashは、この特殊なケースをと同じように処理するため2>&1
、を実行しdup2 (1, 2)
ます。
2>&1
行くSTDERR
のと同じ場所にリダイレクトすることを意味します。STDOUT
それが役立つ1つの例は、grep
これで通常は機能STDOUT
するものであり、次のように機能しSTDOUT
ますSTDERR
。
app 2>&1 | grep hello