Tanto quanto eu posso ver, exec 3>&-
e exec 3<&-
são as mesmas 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 do shell :
2.7.5 Duplicando um descritor de arquivo de entrada
O operador de redirecionamento:
[n] <& palavra
[...RECORTE...]
Se a palavra for avaliada como '-', o descritor de arquivo n ou a entrada padrão, se n não for especificado, deverá ser fechado. Tentativas de fechar um descritor de arquivo que não está aberto não devem constituir um erro. Se a palavra avaliar para outra coisa, o comportamento não será especificado.
2.7.6 Duplicando um descritor de arquivo de saída
O operador de redirecionamento:
[n]> & palavra
[...RECORTE...]
Se a palavra for avaliada como '-', o descritor de arquivo n ou a saída padrão se n não for especificado, será fechado. Tentativas de fechar um descritor de arquivo que não está aberto não devem constituir um erro. Se a palavra avaliar para outra coisa, o comportamento não será especificado.
Observe que nenhum deles especifica nada sobre como o descritor de arquivo n foi aberto originalmente. Isso está de acordo com o fato de que o close (2) não se importa com a maneira como você abriu o arquivo.
Uma rápida descrição do seguinte:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-
contra isso:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-
mostra que nos dois casos, o Bash faz exatamente a mesma coisa.
Dois fatos levemente interessantes
>&-
e<&-
é o padrão fd quando não especificado (>&-
é1>&-
enquanto<&-
está0<&-
). O mesmo para ox>&y
qual é o mesmo quex<&y
exceto quandox
não é fornecido.