Por lo que yo puedo ver, exec 3>&-
y exec 3<&-
son los mismos y se puede utilizar en cualquier descriptor de archivo, independientemente de la forma en que se abrió. De acuerdo con las secciones 2.7.6 y 2.7.5 de la definición POSIX del lenguaje de comandos de Shell :
2.7.5 Duplicar un descriptor de archivo de entrada
El operador de redireccionamiento:
[n] <& palabra
[...RECORTE...]
Si la palabra se evalúa como '-', se cerrará el descriptor de archivo n, o la entrada estándar si no se especifica n. Los intentos de cerrar un descriptor de archivo que no esté abierto no constituirán un error. Si la palabra se evalúa como algo diferente, el comportamiento no se especifica.
2.7.6 Duplicar un descriptor de archivo de salida
El operador de redireccionamiento:
[n]> y palabra
[...RECORTE...]
Si la palabra se evalúa como '-', se cierra el descriptor de archivo n, o la salida estándar si no se especifica n. Los intentos de cerrar un descriptor de archivo que no esté abierto no constituirán un error. Si la palabra se evalúa como algo diferente, el comportamiento no se especifica.
Tenga en cuenta que ninguno especifica nada sobre cómo se abrió originalmente el descriptor de archivo n. Esto está en línea con el hecho de que close (2) no se preocupa por cómo abrió el archivo.
Un fragmento rápido de lo siguiente:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-
versus esto:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-
muestra que en ambos casos, Bash hace exactamente lo mismo.
Dos hechos levemente interesantes
>&-
y<&-
es el fd predeterminado cuando no se especifica (>&-
es1>&-
while<&-
es0<&-
). Lo mismo para lox>&y
que es igual,x<&y
excepto cuandox
no se proporciona.