En el tutorial de bash que estoy leyendo, dice que si abres un descriptor de archivo para leer, es decir
exec 3< echolist
Entonces debes cerrarlo así,
exec 3<&-
Sin embargo, si abre un descriptor de archivo para escribir, debe cerrarse así:
exec 3>&-
Sin embargo, cuando busco en Internet, veo personas abriendo archivos y luego cerrándolos con esto:
exec 3>&-
NOTA: cuando, de acuerdo con el tutorial, deberían estar usando exec 3<&1
.
Entonces, mi pregunta es, ¿pueden cerrarse todos los descriptores de archivos a través de exec n>&-
donde n es el número del descriptor de archivos? ¿Independientemente de si se abrió para leer, escribir o ambos?
bash
shell
io-redirection
Jason
fuente
fuente
>&-
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.Respuestas:
Puede cerrar el descriptor de archivo con ambos
<&-
y>&-
,bash
analizará dos sintaxis como la misma.Del archivo y.tab.c en el
bash
código fuente:fuente
<>
descriptores de archivos.3>&-
o3<&-
parece cerrar el descriptor.<>
se puede hacer de la misma manera.Por lo que yo puedo ver,
exec 3>&-
yexec 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 :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:
versus esto:
muestra que en ambos casos, Bash hace exactamente lo mismo.
Dos hechos levemente interesantes
[n]>&-
cierra los descriptores de archivos.En el código Bash para manejar redirecciones (redir.c) puede encontrar esto:
fuente
[N]>&WORD
: git .savannah.gnu.org / cgit / bash.git / tree / doc / ...Un ejemplo para la comprensión de cuonglm de cerrar un '<>' FD.
Esto se cita de la Guía avanzada de secuencias de comandos Bash en http://tldp.org/LDP/abs/html/io-redirection.html
fuente