1

0 、 1 、 2 が STDIN 、 STDOUT 、および STDERR ファイル記述子であることはわかっています。リダイレクトを理解しようとしています。「>」はファイルへのダンプを意味します 「>>」は追加を意味します

しかし、'>&' は何をするのでしょうか? また、次のコマンドの段階的なプロセスは何ですか?

command > file 2>&1       
command > file 2<&1       
4

3 に答える 3

5

それを段階的に分析してみましょう:

  • >placeは、標準出力を再度開いて、書き込みを開始することを意味しplaceます。これは、書き込み用に開かれるファイル名です。これは典型的なリダイレクトです。

  • N>place任意のファイル記述子nに対して同じことを行います。たとえば2>place、標準エラーであるファイル記述子2をにリダイレクトしますplace1>placeと同じ>placeです。

  • placeが特別な構文で記述されている場合&N、ファイル名ではなく既存のファイル記述子番号として扱われます。したがって、>&2両方1>&2とも、標準出力を再度開いて標準エラーに書き込むことを意味し、2>&1その逆です。

場所<と記述子が読み取り用に開かれ、記号の左側のファイル記述子がデフォルトで0になっていることを除いて、入力についてもまったく同じことが言えます。これは標準入力を表します。2<&1「ファイル記述子2を再度開いて読み取り、将来の読み取りが実際にファイル記述子1から読み取られるようにする」ことを意味します。ファイル記述子1と2の両方が書き込み可能であるため、これは通常のプログラムでは意味がありません。

于 2012-11-19T07:39:01.727 に答える
4

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」リダイレクトはBourneシェルで何をしますか?

于 2012-11-19T07:26:26.740 に答える
1

2>&1行くSTDERRのと同じ場所にリダイレクトすることを意味します。STDOUTそれが役立つ1つの例は、grepこれで通常は機能STDOUTするものであり、次のように機能しSTDOUTますSTDERR

app 2>&1 | grep hello
于 2012-11-19T07:26:59.850 に答える