Soweit ich sehen kann, sind exec 3>&-
und exec 3<&-
die gleichen und können für jeden Dateideskriptor verwendet werden, unabhängig davon, wie er geöffnet wurde. Gemäß den Abschnitten 2.7.6 und 2.7.5 der POSIX-Definition der Shell Command Language :
2.7.5 Duplizieren eines Eingabedateideskriptors
Der Umleitungsoperator:
[n] <& word
[... SNIP ...]
Wenn das Wort '-' ergibt, muss der Dateideskriptor n oder die Standardeingabe ohne Angabe von n geschlossen werden. Versuche, einen nicht geöffneten Dateideskriptor zu schließen, stellen keinen Fehler dar. Wenn word einen anderen Wert ergibt, ist das Verhalten nicht spezifiziert.
2.7.6 Duplizieren eines Ausgabedateideskriptors
Der Umleitungsoperator:
[n]> & word
[... SNIP ...]
Wenn word als '-' ausgewertet wird, wird der Dateideskriptor n oder die Standardausgabe geschlossen, wenn n nicht angegeben ist. Versuche, einen nicht geöffneten Dateideskriptor zu schließen, stellen keinen Fehler dar. Wenn word einen anderen Wert ergibt, ist das Verhalten nicht spezifiziert.
Beachten Sie, dass keines davon etwas darüber angibt, wie der Dateideskriptor n ursprünglich geöffnet wurde. Dies steht im Einklang mit der Tatsache, dass es close (2) egal ist, wie Sie die Datei geöffnet haben.
Ein kurzer Überblick über Folgendes:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-
gegenüber diesem:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-
zeigt, dass Bash in beiden Fällen genau dasselbe tut.
Zwei leicht interessante Fakten
>&-
und<&-
ist der Standardwert fd, wenn nichts angegeben ist (>&-
is1>&-
while<&-
is0<&-
). Das Gleiche gilt fürx>&y
die gleiche ist , wie esx<&y
sei denn,x
nicht vorgesehen ist.