私の知る限り見ることができるように、exec 3>&-
とexec 3<&-
同じであり、関係なく、それが開かれたかの、いずれかのファイルディスクリプタで使用することができます。シェルコマンド言語の POSIX定義のセクション2.7.6および2.7.5によると:
2.7.5入力ファイル記述子の複製
リダイレクト演算子:
[n] <&word
[...をちょきちょきと切る...]
wordが '-'に評価される場合、ファイル記述子n、またはnが指定されていない場合は標準入力は閉じられます。開いていないファイル記述子を閉じようとしてもエラーにはなりません。wordが他の何かに評価される場合、動作は指定されていません。
2.7.6出力ファイル記述子の複製
リダイレクト演算子:
[n]>&word
[...をちょきちょきと切る...]
wordが「-」に評価される場合、ファイル記述子n、またはnが指定されていない場合は標準出力が閉じられます。開いていないファイル記述子を閉じようとしてもエラーにはなりません。wordが他の何かに評価される場合、動作は指定されていません。
どちらも、ファイル記述子nが最初に開かれた方法については何も指定しないことに注意してください。これは、close(2)がファイルを開いた方法を気にしないという事実と一致しています。
以下の簡単な痕跡:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-
対これ:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-
どちらの場合でも、Bashはまったく同じことを行うことを示しています。
2つのやや興味深い事実
>&-
とは、<&-
指定されていないデフォルトのFD(で>&-
ある1>&-
つつ<&-
あります0<&-
)。同じ場合x>&y
は、x<&y
whenx
が指定されていないことを除いて同じです。