Introduction
Les commandes Linux lisent généralement leur entrée depuis le terminal et y affichent leurs résultats. Le shell peut reconnecter ces flux de données à des fichiers ou à d’autres commandes. Cette opération s’appelle la redirection. Elle constitue la base de la journalisation, des pipelines, des tâches en arrière-plan et des scripts shell.
Dans ce lab, vous allez travailler avec l’entrée standard, la sortie standard et l’erreur standard. Vous apprendrez dans quels cas > écrase le contenu existant et dans quels cas >> ajoute du contenu, comment 2> et 2>&1 gèrent les erreurs, comment un tube transmet des données, comment tee affiche et enregistre simultanément une même sortie, et dans quelles situations /dev/null est utile.
Comprendre l’entrée standard, la sortie standard et l’erreur standard
Dans cette étape, vous allez créer un petit fichier d’entrée et le transmettre à des commandes par l’intermédiaire de l’entrée standard.
Chaque commande dispose de trois flux standard :
| Descripteur | Nom | Connexion par défaut |
|---|---|---|
0 |
entrée standard, ou stdin | clavier |
1 |
sortie standard, ou stdout | terminal |
2 |
erreur standard, ou stderr | terminal |
Créez un espace de travail et placez-vous dedans :
mkdir -p /home/labex/project/streams-lab
cd /home/labex/project/streams-lab
Créez un fichier d’entrée de trois lignes avec un document here. Le shell envoie à cat les lignes situées entre les deux marqueurs EOF, tandis que > enregistre la sortie de cat dans input.txt :
cat > input.txt <<'EOF'
alpha
beta
gamma
EOF
Normalement, cat input.txt reçoit un nom de fichier comme argument. L’opérateur < connecte à la place le fichier au descripteur 0, c’est-à-dire à l’entrée standard :
cat < input.txt
Vous devez voir les trois lignes. Utilisez la même redirection de l’entrée avec wc -l, qui compte les lignes :
wc -l < input.txt
La sortie doit être 3. Comme le nom du fichier n’est pas fourni comme argument à wc, seul le nombre est affiché.
Rediriger et ajouter à la sortie standard
Dans cette étape, vous allez rediriger la sortie normale d’une commande et observer la différence entre l’écrasement et l’ajout de contenu.
Vérifiez que vous êtes dans l’espace de travail des flux :
cd /home/labex/project/streams-lab
L’opérateur > connecte le descripteur 1, c’est-à-dire la sortie standard, à un fichier. Il crée le fichier ou tronque son contenu existant avant d’écrire :
echo "Stream report" > report.txt
cat report.txt
Effectuez une autre écriture avec écrasement pour constater que la ligne précédente disparaît :
echo "Input lines: 3" > report.txt
cat report.txt
Utilisez maintenant >>, qui ouvre la destination en mode ajout :
echo "Status: complete" >> report.txt
cat report.txt
Le fichier doit contenir exactement deux lignes : Input lines: 3, suivie de Status: complete. Le shell effectue la redirection avant de lancer la commande.
Séparer la sortie standard et l’erreur standard
Dans cette étape, vous allez exécuter une commande qui produit à la fois une sortie normale et une erreur, puis enregistrer chaque flux dans un fichier différent.
La commande ls suivante reçoit un chemin existant et un chemin inexistant :
cd /home/labex/project/streams-lab
ls -l input.txt missing.txt
La ligne décrivant input.txt appartient à stdout. Le message No such file or directory appartient à stderr. Par défaut, les deux apparaissent dans le terminal, mais ils proviennent de flux distincts.
Redirigez le descripteur 1 avec > et le descripteur 2 avec 2> :
ls -l input.txt missing.txt > listing.log 2> errors.log
La commande renvoie toujours un code de sortie différent de zéro, car l’un des chemins est inexistant, mais le shell reste prêt à recevoir la commande suivante. Examinez les destinations :
cat listing.log
cat errors.log
listing.log doit mentionner input.txt, sans l’erreur. errors.log doit mentionner missing.txt et l’erreur, sans la liste correspondant au chemin existant.
Combiner la sortie standard et l’erreur standard
Dans cette étape, vous allez envoyer stdout et stderr dans un même journal et comprendre pourquoi l’ordre des redirections est important.
Commencez par rediriger stdout vers combined.log, puis dirigez le descripteur 2 vers la destination actuellement utilisée par le descripteur 1 :
cd /home/labex/project/streams-lab
ls -l input.txt missing.txt > combined.log 2>&1
L’expression 2>&1 signifie « envoyer le descripteur 2 vers la même destination que celle actuellement utilisée par le descripteur 1 ». Comme > combined.log apparaît en premier, les deux flux arrivent dans le fichier.
cat combined.log
Le fichier doit contenir à la fois la liste de input.txt et l’erreur concernant missing.txt.
Bash prend également en charge &> comme raccourci pour rediriger les deux flux :
ls -l report.txt absent.txt &> shorthand.log
cat shorthand.log
Ce deuxième fichier doit contenir la liste correcte de report.txt ainsi que l’erreur concernant absent.txt. La forme portable > file 2>&1 est particulièrement courante dans les scripts et les commandes de services.
Afficher et enregistrer la sortie d’un pipeline avec tee
Dans cette étape, vous allez utiliser un pipeline et tee pour afficher la sortie tout en enregistrant les mêmes données dans un fichier.
Un tube, représenté par |, connecte stdout de la commande située à gauche à stdin de la commande située à droite. Triez le fichier d’entrée par ordre alphabétique inverse :
cd /home/labex/project/streams-lab
sort -r input.txt
Avec une redirection de sortie classique, les lignes triées sont écrites dans un fichier et n’apparaissent plus dans le terminal :
sort -r input.txt > sorted.txt
cat sorted.txt
La commande tee copie son entrée standard à la fois vers stdout et vers un fichier indiqué. Exécutez le même tri dans un pipeline :
sort -r input.txt | tee sorted.txt
Vous devez voir les lignes triées à l’écran, et sorted.txt doit recevoir le même contenu. Par défaut, tee écrase sa destination, comme >.
L’option -a demande à tee d’ajouter le contenu. Ajoutez une ligne tout en l’affichant :
echo "delta" | tee -a sorted.txt
cat sorted.txt
Le fichier doit maintenant contenir gamma, beta, alpha et delta. tee est utile lorsque vous avez besoin à la fois d’un retour immédiat dans le terminal et d’un journal enregistré.
Éliminer les données inutiles avec Dev Null
Dans cette étape, vous allez volontairement éliminer un flux avec /dev/null, conserver une sortie utile avec tee et vider un journal existant.
/dev/null est un périphérique spécial qui accepte tout ce qui y est écrit, puis le supprime. Listez un répertoire réel et un répertoire inexistant en éliminant uniquement stderr :
cd /home/labex/project/streams-lab
ls -l . missing-directory 2> /dev/null
Vous devez voir la liste du répertoire, mais aucune erreur concernant missing-directory. Combinez cette opération avec tee afin d’enregistrer également le stdout visible :
ls -l . missing-directory 2> /dev/null | tee visible-listing.log
Le tube ne transporte que stdout. Stderr a été redirigé séparément vers /dev/null avant que le tube ne reçoive les données.
Examinez la liste enregistrée :
cat visible-listing.log
Enfin, créez un journal temporaire, puis utilisez /dev/null comme source d’entrée vide pour effacer son contenu. Un fichier distinct conserve les éléments combinant les deux flux de l’étape 4 :
echo "outdated scratch data" > scratch.log
cat /dev/null > scratch.log
Vérifiez sa taille :
ls -l scratch.log
Le fichier doit toujours exister et avoir une taille de 0 octet. Utilisez les suppressions de flux avec discernement : masquer les erreurs peut compliquer le diagnostic lorsque vous avez réellement besoin d’informations pour résoudre un problème.
Résumé
Vous avez manipulé les trois flux standard et leurs descripteurs de fichiers, connecté des fichiers à stdin avec <, et redirigé stdout avec > et >>. Vous avez séparé stderr avec 2>, l’avez combiné avec stdout à l’aide de 2>&1 et &>, et compris pourquoi l’ordre des opérateurs est important.
Vous avez également comparé la redirection classique vers un fichier aux pipelines et à tee, utilisé tee -a pour ajouter du contenu tout en affichant la sortie, et éliminé les données inutiles avec /dev/null. Ces modèles vous aideront à comprendre plus tard la journalisation, les commandes en arrière-plan et les scripts shell.



