Dans le tutoriel bash que je lis, il est dit que si vous ouvrez un descripteur de fichier pour la lecture, c'est-à-dire.
exec 3< echolist
Ensuite, vous devez le fermer comme ça,
exec 3<&-
Cependant, si vous ouvrez un descripteur de fichier pour l'écriture, il doit être fermé comme ceci:
exec 3>&-
Pourtant, quand je regarde sur Internet, je vois des gens ouvrir des fichiers puis les fermer avec ceci:
exec 3>&-
NOTE: quand, selon le tutoriel, ils devraient utiliser exec 3<&1
.
Ma question est donc de savoir si tous les descripteurs de fichiers peuvent être fermés via exec n>&-
où n est le numéro du descripteur de fichier? Qu'il soit ouvert pour la lecture, l'écriture ou les deux?
Vous pouvez fermer le descripteur de fichier à l'aide des deux <&-
et >&-
, bash
analysera deux syntaxes identiques.
Du fichier y.tab.c dans bash
code source:
5385 /* Hack <&- (close stdin) case. Also <&N- (dup and close). */
5386 if MBTEST(character == '-' && (last_read_token == LESS_AND || last_read_token == GREATER_AND))
5387 return (character);
D'aussi loin que je puisse voir, exec 3>&-
et exec 3<&-
sont les mêmes et peuvent être utilisés sur n'importe quel descripteur de fichier, quelle que soit la façon dont il a été ouvert. Selon les sections 2.7.6 et 2.7.5 de la définition POSIX du Shell Command Language :
2.7.5 Duplication d'un descripteur de fichier d'entrée
L'opérateur de redirection:
[n] <& Word
[...COUPER...]
Si Word est évalué à "-", le descripteur de fichier n, ou l'entrée standard si n n'est pas spécifié, doit être fermé. Les tentatives de fermeture d'un descripteur de fichier qui n'est pas ouvert ne constituent pas une erreur. Si Word est évalué à autre chose, le comportement n'est pas spécifié.
2.7.6 Duplication d'un descripteur de fichier de sortie
L'opérateur de redirection:
[n]> & Word
[...COUPER...]
Si Word est évalué à "-", le descripteur de fichier n ou la sortie standard si n n'est pas spécifié, est fermé. Les tentatives de fermeture d'un descripteur de fichier qui n'est pas ouvert ne constituent pas une erreur. Si Word est évalué à autre chose, le comportement n'est pas spécifié.
Notez qu'aucun ne spécifie quoi que ce soit sur la façon dont le descripteur de fichier n a été ouvert à l'origine. Cela est conforme au fait que close (2) ne se soucie pas de la façon dont vous avez ouvert le fichier.
Une brève séquence des éléments suivants:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4<&-
contre ceci:
exec 3< /etc/passwd
exec 4> foo
exec 3<&-
exec 4>&-
montre que dans les deux cas, Bash fait exactement la même chose.
Deux faits légèrement intéressants
[n]>&-
ferme les descripteurs de fichiers.Dans le code Bash pour gérer les redirections (redir.c), vous pouvez trouver ceci:
738 /* XXX - what to do with [N]<&$w- where w is unset or null? ksh93
739 closes N. */
Un exemple pour la compréhension de cuonglm de la fermeture d'un FD '<>'.
Ceci est extrait du Advanced Bash-Scripting Guide à http://tldp.org/LDP/abs/html/io-redirection.html
[j]<>filename
# Open file "filename" for reading and writing,
#+ and assign file descriptor "j" to it.
# If "filename" does not exist, create it.
# If file descriptor "j" is not specified, default to fd 0, stdin.
#
# An application of this is writing at a specified place in a file.
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
# Random access, by golly.