« 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"
stdin0stdout1stderr202Compare é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"
>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
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.
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.