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