Sur un système Linux, trois fichiers périphériques sont ouverts par défaut : l'entrée standard (stdin, généralement le clavier), la sortie standard (stdout, l'écran) et la sortie d'erreur standard (stderr, également l'écran).
Ces trois flux, ainsi que tout autre fichier ouvert, peuvent être redirigés. Chaque fichier ouvert se voit attribuer un descripteur : 0 pour stdin, 1 pour stdout et 2 pour stderr. Les descripteurs de 3 à 9 sont réservés pour les fichiers supplémentaires.
Redirection de base et lecture depuis un fichier
La redirection ne s'applique généralement qu'à une seule commande. Les commandes suivantes continuent d'utiliser les flux par défaut. L'opération de redirection est interprétée avant l'exécution de la commande elle-même.
Pour rediriger l'entrée standard d'une commande vers un fichier, on utilise l'opérateur <.
$ sort < noms.txt # 'sort' lit la liste depuis noms.txt au lieu du clavier
Il est possible d'appliquer une redirection à un bloc de code complet, comme une boucle, en la placant après le mot-clé done.
compteur=0
while IFS= read -r ligne; do
compteur=$((compteur + 1))
echo "$compteur: $ligne"
done < donnees.csv > rapport.txt
Ici, toute la boucle while lit depuis donnees.csv et son écriture standard est envoyée vers rapport.txt.
Utilisation de here-documents et here-strings
Un here-document permet de passer un bloc de texte multi-lignes en entrée à une commande. Il est délimité par un marqueur.
tr 'a-z' 'A-Z' <<FIN_TEXTE
Ceci est un exemple
de texte à transformer.
FIN_TEXTE
En ajoutant un tiret (<<-), les tabulations en début de ligne dans le script sont ignorées, ce qui permet une indentation propre.
Pour désactiver l'expansion des variables à l'intérieur du here-document, on protège le marqueur avec des guillemets.
cat <<'EOF'
Le répertoire actuel est $PWD, non évalué.
EOF
Un here-string (<<<) fournit une chaîne unique comme entrée. C'est pratique pour envoyer le contenu d'une variable à des filtres comme grep ou sed.
variable="un exemple"
grep -o "ex" <<< "$variable"
Redirection de la sortie standard et des erreurs
L'opérateur > redirige la sortie standard (descripteur 1) vers un fichier, en l'écrasant. L'opérateur >> ajoute le contenu à la fin du fichier.
L'opérateur 2> redirige spécifiquement la sortie d'erreur (descripteur 2).
# Écraser un fichier journal
date > journal.log
# Ajouter à un fichier journal existant
echo "Nouvelle entrée" >> journal.log
# Rediriger les erreurs d'une commande
find / -name "perdu" 2> erreurs.log
Pour rediriger à la fois la sortie standard et les erreurs vers le même fichier, plusieurs syntaxes sont équivalentes :
commande &> fichier.log
commande > fichier.log 2>&1
Le fichier spécial /dev/null agit comme un trou noir. Toute sortie qui y est envoyée est simplement supprimée.
# Masquer toute sortie (utile pour les tests conditionnels)
commande_bruyante > /dev/null 2>&1
Création de fichiers et combinaisons avancées
Exécuter une redirection vers un nom de fichier qui n'existe pas crée ce fichier, éventuellement vide.
> nouveau_fichier.txt # Crée un fichier vide
Il est possible de combiner redirections d'entrée et de sortie en une seule ligne.
# Trier les lignes d'un fichier et écrire le résultat dans un autre
tr '[:lower:]' '[:upper:]' < liste_noms.txt > liste_noms_maj.txt
Un exemple pratique est le déballage d'une archive RPM en utilisant deux redirections successives.
#!/bin/bash
archive=$1
fichier_temp="/tmp/$$.cpio"
# Conversion de l'archive RPM en archive CPIO
rpm2cpio < "$archive" > "$fichier_temp"
# Extraction du contenu de l'archive CPIO
cpio --extract --make-directories < "$fichier_temp"
rm -f "$fichier_temp"