Linux — utilisation avancée et administration · Étape 10

Utilise redirections, pipes et descripteurs

Sépare stdout et stderr, compose des pipelines, utilise tee et pipefail, puis capture proprement une sortie.

Durée indicative · ~1 h 30Niveau intermédiairePrérequis conseillé · Leçon 9 — statuts et opérateursPratique · TP
L’idée reçue

« Tout ce qu’une commande affiche passe dans le pipe. »

Par défaut, un pipe transporte seulement stdout. stderr reste attaché au terminal, sauf redirection explicite.

01Observe les trois flux standard

export LAB="/tmp/soria-linux-permissions-$USER"
"$LAB/bin/diagnostic.sh"
"$LAB/bin/diagnostic.sh" > "$LAB/logs/stdout.log"
"$LAB/bin/diagnostic.sh" 2> "$LAB/logs/stderr.log"
printf '%s
' '--- stdout ---'
cat "$LAB/logs/stdout.log"
printf '%s
' '--- stderr ---'
cat "$LAB/logs/stderr.log"
Descripteur
Nom
Valeur
entrée standard
stdin
0
sortie standard
stdout
1
erreur standard
stderr
2

02Compare écrasement et ajout

printf 'first
' > "$LAB/logs/history.log"
printf 'second
' >> "$LAB/logs/history.log"
printf 'replacement
' > "$LAB/logs/history.log"
cat "$LAB/logs/history.log"

> recrée ou tronque la destination. >> ajoute à la fin. Le choix doit être explicite, surtout pour les journaux.

03Fusionne ou sépare les sorties

"$LAB/bin/echec.sh" > "$LAB/logs/echec.out" 2> "$LAB/logs/echec.err" || true

"$LAB/bin/echec.sh" > "$LAB/logs/echec-all.log" 2>&1 || true

cat "$LAB/logs/echec-all.log"
L’ordre compte : >file 2>&1 attache stderr à la destination actuelle de stdout. Inverser les redirections peut produire un autre résultat.

04Compose un pipeline

printf '%s
' alpha beta beta gamma | sort | uniq -c | sort -nr

Chaque commande lit le flux précédent et écrit le suivant. Un pipeline est utile lorsqu’il reste lisible et que chaque étape a une responsabilité simple.

05Vois et conserve avec tee

"$LAB/bin/diagnostic.sh" 2>&1 | tee "$LAB/logs/diagnostic-complet.log" | grep -E 'service|warning'

tee duplique le flux vers un fichier et stdout. Il est adapté aux commandes dont on veut conserver la preuve tout en poursuivant le traitement.

06Détecte un échec masqué dans un pipe

set +o pipefail
"$LAB/bin/echec.sh" | cat
printf 'without-pipefail=%s
' "$?"

set -o pipefail
rc=0
"$LAB/bin/echec.sh" | cat || rc=$?
printf 'with-pipefail=%s
' "$rc"
unset rc
Sans pipefail, le statut du pipeline est celui de la dernière commande. Un échec en amont peut donc disparaître derrière un cat ou un filtre réussi.

07Capture une valeur, pas un journal entier

kernel=$(uname -r)
line_count=$(wc -l < "$LAB/logs/diagnostic-complet.log")
printf 'kernel=%s lines=%s
' "$kernel" "$line_count"

La substitution $(…) capture stdout. stderr reste visible, ce qui permet de conserver les diagnostics sans polluer la variable.

Challenge autonome

Produis un rapport de diagnostic

Exécute les deux scripts du laboratoire, conserve stdout et stderr séparément, crée un fichier fusionné avec horodatage, extrait les lignes service ou fatal, puis retourne un statut non nul si le second script échoue.

08Réinitialise le laboratoire

./module2-permissions-streams-lab.sh status
./module2-permissions-streams-lab.sh reset

Ce que tu retiens

Les flux standard sont indépendants. Les redirections contrôlent leur destination, les pipes composent les traitements et pipefail empêche qu’un échec amont soit masqué par une dernière commande réussie.

Ta progression

Chargement de l’état… Se connecter pour synchroniser.