# 3.3 - Redirections, tubes et tee

Les commandes utilisent trois flux standards :

| Numéro | Flux | Rôle |
|---:|---|---|
| 0 | entrée standard, `stdin` | données reçues par la commande |
| 1 | sortie standard, `stdout` | résultat normal |
| 2 | erreur standard, `stderr` | avertissements et erreurs |

## Rediriger la sortie

```bash
commande > resultat.txt       # remplacer le fichier
commande >> resultat.txt      # ajouter à la fin
commande 2> erreurs.txt       # erreurs seulement
commande > tout.txt 2>&1      # sortie et erreurs dans le même fichier
commande &> tout.txt          # raccourci Bash
```

`>` vide le fichier avant d'exécuter la commande. Vérifier le chemin et préférer `>>` lorsqu'un historique doit être conservé.

Ignorer une sortie :

```bash
commande > /dev/null
commande > /dev/null 2>&1
```

## Fournir une entrée

```bash
sort < noms.txt
```

Document intégré :

```bash
cat <<'EOF'
Le contenu $VARIABLE reste littéral
Deuxième ligne
EOF
```

## Relier des commandes avec un tube

Le tube `|` transmet la sortie standard d'une commande à l'entrée de la suivante.

```bash
ps aux | grep '[s]shd'
journalctl -b | grep -i 'error'
find . -type f | wc -l
```

Une chaîne se lit de gauche à droite : produire, filtrer, transformer puis résumer.

```bash
cut -d: -f1 /etc/passwd | sort | uniq
```

## Voir et enregistrer avec tee

```bash
ip addr | tee diagnostic-reseau.txt
ip addr | tee -a diagnostic-complet.txt
```

Écrire dans un fichier protégé :

```bash
printf '%s\n' 'option=valeur' | sudo tee /etc/application.conf
```

`tee` affiche aussi ce qu'il écrit. Ajouter `> /dev/null` pour masquer cette copie d'écran.

## Codes d'erreur dans un pipeline

Par défaut, le shell retourne souvent le code de la dernière commande du pipeline. Dans un script Bash sensible :

```bash
set -o pipefail
commande1 | commande2
echo "$?"
```

`pipefail` signale l'échec d'une commande intermédiaire. Dans un terminal, voir les codes de tout le dernier pipeline :

```bash
printf '%s\n' "${PIPESTATUS[@]}"
```

Ne mélangez pas au hasard `sudo`, les redirections et les tubes : chaque partie peut s'exécuter avec des privilèges différents.