GNU/Linux >> Tutoriels Linux >  >> Linux

Signification des symboles de flèches dans la duplication/fermeture des descripteurs de fichiers sous Bash ?

Je lis un livre sur la ligne de commande Linux où l'auteur ne semble pas suivre les conventions du manuel bash concernant les symboles de flèches utilisés dans les opérations de redirection. A savoir, il utilise toujours la flèche gauche < dans la duplication et la fermeture des descripteurs de fichiers, qu'il s'agisse d'entrées ou de sorties.

Voici un exemple :

exec 3<&0 4<&1 #shouldn't be 4>&1 ?
#...
exec 3<&- 4<&- #shouldn't be 4>&- ?

La page de manuel de Bash est vague sur ce point, selon elle, les descripteurs de fichier de duplication/fermeture et déplacement ont les syntaxes suivantes :

#Duplicating and closing (in case word expands to -):
[n]<&word 
[n]>&word

#Moving:
[n]<&digit-
[n]>&digit-

Ils sont décrits comme ayant un comportement différent uniquement si nous ne fournissons pas explicitement le n . Mais lorsque nous le faisons, cela signifie-t-il que nous pouvons utiliser ces formulaires de manière interchangeable ?

Réponse acceptée :

Cela n'a pas d'importance car 4>&1 et 4<&1 faire la même chose :dup2(1, 4) qui est l'appel système pour dupliquer un fd sur un autre. Le fd dupliqué hérite automatiquement de la direction d'E/S du fd d'origine. (idem pour 4>&- contre 4<&- qui se résolvent tous les deux en close(4) , et 4>&1- qui est le dup2(1, 4) suivi de close(1) ).

Cependant, le 4<&1 la syntaxe est déroutante à moins que, pour une raison quelconque, le fd 1 soit explicitement ouvert à la lecture (ce qui serait encore plus déroutant), donc dans mon esprit, il devrait être évité.

Le fd dupliqué partage la même description de fichier ouvert ce qui signifie qu'ils partagent le même décalage dans le fichier (pour les types de fichiers où cela a du sens) et les mêmes drapeaux associés (redirection d'E/S/mode d'ouverture, O_APPEND et ainsi de suite).

Sous Linux, il existe un autre moyen de dupliquer un fd (ce qui n'est pas vraiment une duplication) et créez une nouvelle description de fichier ouverte pour la même ressource mais avec des drapeaux éventuellement différents.

exec 3> /dev/fd/4

Alors que sur Solaris et probablement la plupart des autres Unix, cela équivaut plus ou moins à dup2(4, 3) , sous Linux, qui ouvre la même ressource que celle pointée par le fd 4 à partir de zéro.

C'est une différence importante, car par exemple, pour un fichier normal, le décalage de fd 3 sera 0 (le début du fichier) et le fichier sera tronqué (c'est pourquoi, par exemple, sous Linux, vous devez écrire tee -a /dev/stderr au lieu de tee /dev/stderr ).

Connexe :Comment dire à Firefox d'utiliser un autre appareil ALSA ?

Et le mode d'E/S peut être différent.

Fait intéressant, si fd 4 pointait vers l'extrémité de lecture d'un tube, alors fd 3 pointe maintenant vers l'extrémité d'écriture (/dev/fd/3 se comporte comme un tube nommé ):

$ echo a+a | { echo a-a > /dev/fd/0; tr a b; }
b+b
b-b

$ echo a+a | { echo a-a >&0; tr a b; }
bash: echo: write error: Bad file descriptor
b+b

Linux
  1. Astuces Bash plus stupides :variables, recherche, descripteurs de fichiers et opérations à distance

  2. Un script Bash peut-il être accroché à un fichier ?

  3. La fête ?

  4. Effectuer des opérations d'écriture atomique dans un fichier dans Bash ?

  5. Comment parser un fichier CSV dans Bash ?

Bash :ajouter au fichier

Comment rediriger stderr vers stdout dans Bash

Remplacement de chaîne dans Bash

35 exemples de scripts bash

Script Bash - Instructions conditionnelles

Script bash (III)