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 revisionPrevious revision
Next revisionBoth sides next revision
informatique:linux:programmation_shell [2019/04/24 07:53] – [pipe ("|")] pteuinformatique:linux:programmation_shell [2019/04/24 09:36] – [Descripteurs de fichier] pteu
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" >&      # erreur "Bad file descriptor"
 +echo "toto" 3>&1 >& # 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 <&            # Read only 4 characters.
 +echo -n . >&            # 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: 2023/10/02 13:35 by pteu