>&Nでは、Nがファイル名ではなくファイル記述子として扱われるのはなぜですか(マニュアルで言うように)?

>&Nでは、Nがファイル名ではなくファイル記述子として扱われるのはなぜですか(マニュアルで言うように)?

BashでIOリダイレクトを理解しようとしています。私は以下のような多くの例を見ました(文字通り許可された答えから来ました)。ここ):

exec 3<> /tmp/foo  #open fd 3.
echo "test" >&3
exec 3>&- #close fd 3.

2行目はわかりません。正確に言えば、その動作がbashマニュアルにどのように準拠しているのか理解できません。

明らかに、2行目にはファイル記述子3への>&3リダイレクトが必要ですstdout(おそらくstderrわかりません)。他のすべては意味がありません。

しかし、現在のbashマニュアル(作成時)セクション3.6.4(マイフォーマット):

この構造は、標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)を受け入れます。ファイルにリダイレクト彼の名前は言葉の拡張です。 標準出力と標準エラーをリダイレクトするには2つの形式があります
&>word>&word

[その後、最初の形式と2番目の形式の微妙な違いについて説明しますが、この質問では問題ではないので、今は別々にします。 ]

私が理解したところ、これはファイル記述子にリダイレクトするのとは非常に異なる名前のファイルに>&3リダイレクトするstderrことを意味します。stdout3stdoutstderr3

誰かが私が逃したことを説明できますか?

答え1

実際、最も関連性の高い部分は、横に置いておく部分です(GNU バッシュ文書):

3.6.4 標準出力および標準エラーリダイレクト

この構造を使用すると、標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)を名前付き単語拡張ファイルにリダイレクトできます。

標準出力と標準エラーをリダイレクトするには、2つの形式があります。

&>word 

そして

>&word 

2つの形式のうち、最初の形式が好ましい。これは意味上次のとおりです。

>word 2>&1 

2番目の形式を使用すると、単語は数字または「-」に拡張できません。その場合、互換性の理由から他のリダイレクト演算子が適用されます(下記のファイル記述子のコピーを参照)。

この最後のポイントが最も重要なので、ここでもう一度繰り返します。

2番目の形式を使用すると、単語は数字または「-」に拡張できません。その場合、互換性の理由から他のリダイレクト演算子が適用されます(下記のファイル記述子のコピーを参照)。

したがって、word数字またはに展開すると、特別なルールがトリガーされます-。文字列はそれ自体拡張されているので、「拡張3」されたと言われています。3これは、文字列が>&3次に説明する規則に従って処理されることを意味します。ファイル記述子部分のコピー:

リダイレクト演算子

[n]<&word 

入力ファイル記述子のコピーに使用されます。単語が1つ以上の数字に展開されると、nで表されるファイル記述子はそのファイル記述子のコピーになります。単語の数字が入力用に開かれたファイル記述子を指定しないと、リダイレクトエラーが発生します。単語が「-」と評価されると、ファイル記述子nが閉じられます。 nを指定しないと、標準入力(ファイル記述子0)が使用されます。

オペレーター

[n]>&word 

使用法は、出力ファイル記述子のコピーと似ています。 nを指定しないと、標準出力(ファイル記述子1)が使用されます。単語の数字が出力用に開かれたファイル記述子を指定しないと、リダイレクトエラーが発生します。単語が「-」と評価されると、ファイル記述子nが閉じられます。特別な場合には、nが省略され、単語が1つ以上の数字または「-」に拡張されない場合、標準出力と標準エラーは前述のようにリダイレクトされます。

これらすべては、以下を説明するためのものです。特定後に数字が続く場合、>&その数字はファイル記述子と見なされます。おそらく、これが&>wordマニュアルに似た製品よりも優れていると明示されている理由です。>&word&>word

関連情報