Guide avancé d'écriture des scripts Bash: | ||
---|---|---|
Précédent | Chapitre 16. Redirection d'E/S (entrées/sorties) | Suivant |
Une commande exec <filename redirige stdin vers un fichier. A partir de là, stdin vient de ce fichier, plutôt que de sa source habituelle (généralement un clavier). Ceci fournit une méthode pour lire un fichier ligne par ligne et donc d'analyser chaque ligne de l'entrée en utilisant sed et/ou awk.
Exemple 16-1. Rediriger stdin en utilisant exec
#!/bin/bash # Rediriger stdin en utilisant 'exec'. exec 6<&0 # Lie le descripteur de fichier #6 avec stdin. # Sauvegarde stdin. exec < fichier-donnees # stdin remplacé par le fichier "fichier-donnees" read a1 # Lit la première ligne du fichier "fichier-donnees". read a2 # Lit la deuxième ligne du fichier "fichier-donnees". echo echo "Les lignes suivantes lisent le fichier." echo "---------------------------------------" echo $a1 echo $a2 echo; echo; echo exec 0<&6 6<&- # Maintenant, restaure stdin à partir de fd #6, où il a été sauvegardé, #+ et fermeture de fd #6 ( 6<&- ) pour le libérer pour d'autres processus. # # <&6 6<&- fonctionne aussi. echo -n "Entrez des données " read b1 # Maintenant les fonctions lisent ("read") comme d'ordinaire, #+ c'est-à-dire à partir de stdin. echo "Entrée lue à partir de stdin." echo "-----------------------------" echo "b1 = $b1" echo exit 0 |
De la même façon, une commande exec >nomfichier redirige stdout vers un fichier désigné. Ceci envoie toutes les sorties des commandes qui devraient normalement aller sur stdout vers ce fichier.
Exemple 16-2. Rediriger stdout en utilisant exec
#!/bin/bash # reassign-stdout.sh FICHIERTRACES=fichiertraces.txt exec 6>&1 # Lie le descripteur de fichier #6 avec stdout. # Sauvegarde stdout. exec > $FICHIERTRACES # stdout remplacé par le fichier "fichiertraces.txt". # ----------------------------------------------------------- # # Toute sortie des commandes de ce bloc sera envoyée dans le fichier #+ $FICHIERTRACES. echo -n "Fichier traces: " date echo "-------------------------------------" echo echo "Sortie de la commande \"ls -al\"" echo ls -al echo; echo echo "Sortie de la commande \"df\"" echo df # ----------------------------------------------------------- # exec 1>&6 6>&- # Restaure stdout et ferme le descripteur de fichier #6. echo echo "== stdout restauré à sa valeur par défaut == " echo ls -al echo exit 0 |
Exemple 16-3. Rediriger à la fois stdin et stdout dans le même script avec exec
#!/bin/bash # upperconv.sh # Convertit un fichier d'entrée spécifié en majuscule. E_ACCES_FICHIER=70 E_MAUVAIS_ARGS=71 if [ ! -r "$1" ] # Est-ce que le fichier spécifié est lisible? then echo "Ne peut pas lire le fichier d'entrée!" echo "Usage: $0 fichier-entrée fichier-sortie" exit $E_ACCES_FICHIER fi # Sortira avec la même erreur, #+ même si le fichier d'entrée ($1) n'est pas spécifié. if [ -z "$2" ] then echo "A besoin d'un fichier de sortie." echo "Usage: $0 fichier-entrée fichier-sortie" exit $E_MAUVAIS_ARGS fi exec 4<&0 exec < $1 # Lira le fichier d'entrée. exec 7>&1 exec > $2 # Ecrira sur le fichier de sortie. # Assume que le fichier de sortie est modifiable #+ (ajoutez une vérification?). # ----------------------------------------------- cat - | tr a-z A-Z # Conversion en majuscule. # ^^^^^ # Lecture de stdin. # ^^^^^^^^^^ # Ecriture sur stdout. # Néanmoins, à la fois stdin et stdout ont été redirigés. # ----------------------------------------------- exec 1>&7 7>&- # Restaure stout. exec 0<&4 4<&- # Restaure stdin. # Après retour à la normal, la ligne suivante affiche sur stdout comme de #+ normal. echo "Le fichier \"$1\" a été enregistré dans \"$2\" après une convertion en majuscule." exit 0 |
Précédent | Sommaire | Suivant |
Redirection d'E/S (entrées/sorties) | Niveau supérieur | Rediriger les blocs de code |