Tanto quanto eu posso ver, exec 3>&-
e exec 3<&-
são os mesmos e podem ser usados em qualquer descritor de arquivo, independentemente de como ele foi aberto. De acordo com as seções 2.7.6 e 2.7.5 da definição POSIX da Linguagem de Comando Shell :
2.7.5 Duplicating an Input File Descriptor
The redirection operator:
[n]<&word
[...SNIP...]
If word evaluates to '-', file descriptor n, or standard input if n is
not specified, shall be closed. Attempts to close a file descriptor
that is not open shall not constitute an error. If word evaluates to
something else, the behavior is unspecified.
2.7.6 Duplicating an Output File Descriptor
The redirection operator:
[n]>&word
[...SNIP...]
If word evaluates to '-', file descriptor n, or standard output if n
is not specified, is closed. Attempts to close a file descriptor that
is not open shall not constitute an error. If word evaluates to
something else, the behavior is unspecified.
Observe que nem especifica nada sobre como o descritor de arquivo n foi aberto originalmente. Isso está de acordo com o fato de que close (2) não se importa com a forma como você abriu o arquivo.
Um rápido resumo do seguinte:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-
versus isso:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-
mostra que, em ambos os casos, o Bash faz exatamente a mesma coisa.
Dois fatos levemente interessantes