User Tools

Site Tools


informatique:linux:programmation_shell

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
informatique:linux:programmation_shell [2019/04/24 09:53]
pteu [pipe ("|")]
informatique:linux:programmation_shell [2019/04/24 11:36] (current)
pteu [Descripteurs de fichier]
Line 240: Line 240:
 </​code>​ </​code>​
  
 +
 +======Descripteurs de fichier======
 +
 +Il existe 3 descripteurs de fichier standards, utilisés par toutes les commandes : 0, 1 et 2 correspondants à STDIN, STDOUT et STDERR (input, output et erreur). 0 pointe par défaut sur le clavier, 1 et 2 sont affichés par défaut à l'​écran.
 +
 +Pour lire depuis un fichier plutôt que depuis le clavier :
 +<code bash>
 +echo toto > /​tmp/​fichier.txt
 +read VAR < /​tmp/​fichier.txt
 +echo $VAR
 + toto
 +</​code>​
 +
 +====Les redirecteurs====
 +
 +  * ''>''​ redirige la sortie vers un fichier ; ''>​ fichier''​ a pour effet de créer un fichier vide ou de supprimer le contenu du fichier s'il existe déjà (équivaut à ''​touch fichier''​). Pour des raisons de portabilité il vaut mieux utiliser '':​ > fichier''​ qui a le même effet.
 +  * ''<​nowiki>>></​nowiki>''​ possède le même comportement mais écrit à la fin du fichier existant, sans écraser son contenu
 +  * ''&>​fichier''​ a pour effet de rediriger les flux STDOUT et STDERR dans le fichier.
 +  * ''<''​ permet de rediriger un fichier dans l'​entrée standard d'une commande, par ex : ''​read TOTO < fichier.txt''​ (équivaut à ''​read TOTO 0< fichier.txt''​)
 +
 +Ces redirecteurs sont restaurés à leur valeur par défaut à chaque nouvelle ligne ; en revanche tous les processus fils héritent des descripteurs de leur processus père, à moins que celui-ci ne les ferme (voir plus bas).
 +
 +''​|''​ est aux flux ce que ''>''​ est aux fichiers : il permet de rediriger le flux de sortie d'une commande vers l'​entrée d'une autre commande.
 +
 +Pour rediriger le flux d'​erreur dans un fichier plutôt que l'​afficher à l'​écran,​ on réassigne 2 :
 +<code bash>
 +./prog 2>/​tmp/​prog_erreur.log
 +</​code>​
 +
 +Pour rediriger le flux d'​erreur sur STDOUT et donc l'​envoyer dans le pipe :
 +<code bash>
 +./prog 2>&1 | ./​prog2 ​ # prog2 va recevoir en entrée les flux STDOUT et STDERR de prog1
 +# équivaut à
 +./prog |& ./prog2
 +# (depuis bash4, "​|&"​ est reconnue comme abréviation de "​2>&​1 |")
 +</​code>​
 +
 +
 +Par défaut ''>''​ écrase le fichier existant ; pour ajouter les erreurs à la fin du fichier, on utilise ''>>''​ :
 +<code bash>
 +./prog 2>>/​tmp/​prog_erreur.log
 +</​code>​
 +Ainsi on conserve les erreurs de chaque exécution du programme.
 +
 +On peut utiliser les descripteurs 3 et plus également, en les initialisant pour ne pas générer d'​erreur (ils ne le sont pas par défaut) :
 +<code bash>
 +echo "​toto"​ >&​3 ​      # erreur "Bad file descriptor"​
 +echo "​toto"​ 3>&1 >&​3 ​ # OK, va afficher le résultat sur 3 qui pointe sur 1 qui est la STDOUT
 + toto
 +</​code>​
 +
 +Pour fermer un descripteur de fichier (le 3 par ex) : ''​3>&​-''​
 +
 +On peut faire pointer un descripteur vers un fichier du système :
 +<code bash>
 +exec 3<> /​tmp/​foo ​  # ouverture du fd 3
 +echo toto >&3
 +exec 3>&​- ​          # fermeture du fd
 +</​code>​
 +
 +Exemple d'​utilisation d'un descripteur de fichier sur un fichier : écrire un caractère au milieu de ce dernier (src : [[http://​tldp.org/​LDP/​abs/​html/​io-redirection.html|tldp.org]]).
 +<code bash>
 +#  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
 +</​code> ​     ​
  
 ======Les fonctions====== ======Les fonctions======
informatique/linux/programmation_shell.txt · Last modified: 2019/04/24 11:36 by pteu