web-dev-qa-db-fra.com

Fermeture d'un descripteur de fichier,> & - vs <& -

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?

50
Jason

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);
51
cuonglm

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

16
Steven D

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.
7
DMW