Trois différents << fichiers >> sont toujours ouvert par défaut, stdin (le clavier), stdout (l'écran), et stderr (la sortie des messages d'erreur vers l'écran). Ceux-ci, et n'importe quel autre fichier ouvert, peuvent être redirigés. La redirection signifie simplement la capture de la sortie d'un fichier, d'une commande, d'un programme, d'un script, voire même d'un bloc de code dans un script (voir Exemple 3-1 et Exemple 3-2) et le renvoi du flux comme entrée d'un autre fichier, commande, programme ou script.
Chaque fichier ouvert se voit affecté un descripteur de fichier. [1] Les descripteurs de fichier pour stdin, stdout et stderr sont 0, 1 et 2, respectivement. Pour ouvrir d'autres fichiers, il reste les descripteurs 3 à 9. Il est quelque fois utile d'affecter un de ces descripteurs supplémentaires de fichiers pour stdin, stdout ou stderr comme lien dupliqué temporaire. [2] Ceci simplifie le retour à la normale après une redirection complexe et un remaniement (voir Exemple 16-1).
SORTIE_COMMANDE > # Redirige la sortie vers un fichier. # Crée le fichier si il n'est pas présent, sinon il l'écrase. ls -lR > repertoire.liste # Crée un fichier contenant la liste des fichiers du répertoire. : > nom_fichier # Le > vide le fichier "nom_fichier". # Si le fichier n'est pas présent, crée un fichier vide (même effet que # 'touch'). # Le : sert en tant que contenant, ne produisant aucune sortie. > nom_fichier # Le > vide le fichier "nom_fichier". # Si le fichier n'est pas présent, crée un fichier vide (même effet que # (Même résultat que ": >", ci-dessus, mais ceci ne fonctionne pas avec # certains shells.) SORTIE_COMMANDE >> # Redirige stdout vers un fichier. # Crée le fichier si il n'est pas présent, sinon il lui ajoute le flux. # Commandes de redirection sur une seule ligne (affecte seulement la ligne # sur laquelle ils sont): # -------------------------------------------------------------------- 1>nom_fichier # Redirige stdout vers le fichier "nom_fichier". 1>>nom_fichier # Redirige et ajoute stdout au fichier "nom_fichier". 2>nom_fichier # Redirige stderr vers le fichier "nom_fichier". 2>>nom_fichier # Redirige et ajoute stderr au fichier "nom_fichier". &>nom_fichier # Redirige à la fois stdout et stderr vers le fichier "nom_fichier". #============================================================================== # Rediriger stdout, une ligne à la fois. FICHIERLOG=script.log echo "Cette instruction est envoyée au fichier de traces, \"$FICHIERLOG\"." 1>$FICHIERLOG echo "Cette instruction est ajoutée à \"$FICHIERLOG\"." 1>>$FICHIERLOG echo "Cette instruction est aussi ajoutée à \"$FICHIERLOG\"." 1>>$FICHIERLOG echo "Cette instruction est envoyé sur stdout et n'apparaitra pas dans \"$FICHIERLOG\"." # Ces commandes de redirection sont "réinitialisées" automatiquement après chaque ligne. # Rediriger stderr, une ligne à la fois. FICHIERERREURS=script.erreurs mauvaise_commande1 2>$FICHIERERREURS # Message d'erreur envoyé vers $FICHIERERREURS. mauvaise_commande2 2>>$FICHIERERREURS # Message d'erreur ajouté à $FICHIERERREURS. mauvaise_commande3 # Message d'erreur envoyé sur stderr, #+ et n'apparaissant pas dans $FICHIERERREURS. # Ces commandes de redirection sont aussi "réinitialisées" automatiquement après chaque ligne. #============================================================================== 2>&1 \ # Redirige stderr vers stdout. # Les messages d'erreur sont envoyés à la même place que la sortie standard. i>&j # Redirige le descripteur de fichier i vers j. # Toute sortie vers le fichier pointé par i est envoyée au fichier pointé par j. >&j # Redirige, par défaut, le descripteur de fichier 1 (stdout) vers j. # Toutes les sorties vers stdout sont envoyées vers le fichier pointé par j. 0< NOM_FICHIER < NOM_FICHIER # Accepte l'entrée à partir d'un fichier. # Commande compagnon de << > >>, et souvent utilisée en combinaison avec elle. # # grep mot_recherché <nom_fichier [j]<>nom_fichier # Ouvre le fichier "nom_fichier" pour lire et écrire, et affecter le descripteur de fichier "j" à celui-ci. # Si "nom_fichier" n'existe pas, le créer. # Si le descripteur de fichier "j" n'est pas spécifié, le défaut est fd 0, stdin. # # Une application de ceci est d'écrire à une place spécifiée dans un fichier. echo 1234567890 > Fichier # Ecrire une chaîne dans "Fichier". exec 3<> Fichier # Ouvrir "Fichier" et lui affecter le fd 3. read -n 4 <&3 # Lire seulement quatre caractères. echo -n . >&3 # Ecrire un point décimal à cet endroit. exec 3>&- # Fermer fd 3. cat Fichier # ==> 1234.67890 # Accès au hasard, par golly. | # Tube. # outil de chaînage de processus et de commande à but général. # Similaire à << > >>, mais plus général dans l'effet. # Utile pour chaîner des commandes, scripts, fichiers et programmes. cat *.txt | sort | uniq > fichier-resultat # Trie la sortie de tous les fichiers .txt et supprime les lignes # dupliquées, pour finalement enregistrer les résultats dans # << fichier-résultat >>. |
Plusieurs instances de redirection d'entrées et de sorties et/ou de tubes peuvent être combinées en une seule ligne de commande.
commande < fichier-entrée > fichier-sortie commande1 | commande2 | commande3 > fichier-sortie |
Plusieurs flux de sortie peuvent être redirigés vers un fichier.
ls -yz >> commande.log 2>&1 # La capture résulte des options illégales "yz" de "ls" dans le fichier # "commande.log". # Parce que stderr est redirigé vers le fichier, aucun message d'erreur ne sera # visible. |
Fermer les descripteurs de fichiers
Ferme le descripteur de fichier n.
Ferme stdin.
Ferme le descripteur de fichiers de sortie n.
Ferme stdout.
Les processus fils héritent des descripteurs de fichiers ouverts. C'est pourquoi les tubes fonctionnent. Pour empêcher l'héritage d'un fd, fermez-le.
# Rediriger seulement stderr vers un tube. exec 3>&1 # Sauvegarde la valeur "actuelle" de stdout. ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Ferme fd 3 pour 'grep' (mais pas pour 'ls'). # ^^^^ ^^^^ exec 3>&- # Maintenant, fermez-le pour le reste du script. # Merco, S.C. |
Pour une introduction plus détaillée de la redirection d'E/S, voir Annexe D.
[1] | Un descripteur de fichier est simplement un numéro que le système d'exploitation affecte à un fichier ouvert pour garder sa trace. Considérez cela comme une version simplifiée d'un pointeur de fichier. C'est analogue à un handle vers un fichier en C. |
[2] | Utiliser le descripteur de fichier 5 pourrait causer des problèmes. Lorsque Bash crée un processus fils, par exemple avec exec, le fils hérite de fd 5 (voir le courrier électronique archivé de Chet Ramey, SUBJECT: RE: File descriptor 5 is held open, NdT: Le descripteur de fichier est laissé ouvert). Il est plus raisonnable de laisser ce descripteur tranquille. |
Précédent | Sommaire | Suivant |
Expansion arithmétique | Niveau supérieur | Utiliser exec |