O ile widzę, exec 3>&-
i exec 3<&-
są takie same i może być używany na dowolnej deskryptora pliku, niezależnie od tego, w jaki sposób została ona otwarta. Zgodnie z sekcjami 2.7.6 i 2.7.5 definicji POSIX języka poleceń poleceń :
2.7.5 Duplikowanie deskryptora pliku wejściowego
Operator przekierowania:
[n] <i słowo
[...FANTASTYCZNA OKAZJA...]
Jeżeli słowo ma wartość „-”, deskryptor pliku n lub standardowe wejście, jeśli n nie jest określone, powinno zostać zamknięte. Próby zamknięcia deskryptora pliku, który nie jest otwarty, nie stanowią błędu. Jeśli słowo zmienia się na coś innego, zachowanie jest nieokreślone.
2.7.6 Duplikowanie deskryptora pliku wyjściowego
Operator przekierowania:
[n]> i słowo
[...FANTASTYCZNA OKAZJA...]
Jeśli słowo zamienia się w „-”, deskryptor pliku n lub standardowe wyjście, jeśli n nie jest określone, jest zamykane. Próby zamknięcia deskryptora pliku, który nie jest otwarty, nie stanowią błędu. Jeśli słowo zmienia się na coś innego, zachowanie jest nieokreślone.
Zauważ, że żadne z nich nie określa niczego, w jaki sposób deskryptor pliku n został otwarty. Jest to zgodne z faktem, że close (2) nie dba o to, jak otworzyłeś plik.
Krótki ciąg następujących czynności:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-
kontra to:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-
pokazuje, że w obu przypadkach Bash robi dokładnie to samo.
Dwa mało interesujące fakty
>&-
i<&-
jest domyślny fd, gdy nie jest określony (>&-
jest1>&-
while<&-
jest0<&-
). To samo, dlax>&y
którego jest to samo, cox<&y
z wyjątkiem sytuacji, gdyx
nie jest zapewniony.