# 🔀 Comprendre les redirections : stdout, stderr, 2>&1, /dev/null et tee

Les redirections sont l'un des concepts les plus importants à maîtriser sous Linux. Elles permettent de contrôler où sont envoyés les résultats d'une commande et les messages d'erreur.

---

## 📑 Sommaire

- [Les flux standards](#bkmrk-%F0%9F%93%A1-les-flux-standards)
- [Redirection de stdout](#bkmrk-%F0%9F%93%A4-redirection-de-std)
- [Redirection de stderr](#bkmrk-%E2%9A%A0%EF%B8%8F-redirection-de-st)
- [Comprendre 2&gt;&amp;1](#bkmrk-%F0%9F%A7%A0-comprendre-2%3E%261)
- [Le fichier /dev/null](#bkmrk-%F0%9F%97%91%EF%B8%8F-comprendre-%2Fdev%2Fn)
- [La commande tee](#bkmrk-%F0%9F%AB%96-comprendre-la-comm)
- [Résumé des redirections](#bkmrk-%F0%9F%93%8B-r%C3%A9sum%C3%A9-rapide)

---

## 📡 Les flux standards Linux

<div id="bkmrk-informationchaque-pr" style="border-left: 4px solid #3498db; padding: 10px; background: #f8f9fa;">**Information**  
Chaque programme Linux utilise trois flux standards.</div><table id="bkmrk-flux-num%C3%A9ro-descript"><thead><tr><th>Flux</th><th>Numéro</th><th>Description</th></tr></thead><tbody><tr><td>stdin</td><td>0</td><td>Entrée standard (clavier)</td></tr><tr><td>stdout</td><td>1</td><td>Sortie standard</td></tr><tr><td>stderr</td><td>2</td><td>Sortie d'erreur</td></tr></tbody></table>

### Schéma général

```
             Clavier
                |
                v
            stdin (0)

             COMMANDE

stdout (1) -------------> Écran

stderr (2) -------------> Écran
```

Par défaut, les résultats et les erreurs sont affichés sur le terminal.

---

## 📤 Redirection de stdout (1)

Le symbole `>` redirige la sortie standard.

```
ls /etc > resultat.txt
```

### Ce qui se passe

```
stdout (1)
    |
    v
resultat.txt
```

Le contenu n'est plus affiché à l'écran mais enregistré dans le fichier.

### Écrasement vs Ajout

<table id="bkmrk-syntaxe-effet-%3E-%C3%89cra"><thead><tr><th>Syntaxe</th><th>Effet</th></tr></thead><tbody><tr><td>`>`</td><td>Écrase le fichier</td></tr><tr><td>`>>`</td><td>Ajoute à la fin du fichier</td></tr></tbody></table>

#### Exemple

```
echo "Bonjour" > test.txt
echo "Monde" > test.txt
```

Résultat :

```
Monde
```

Le premier contenu a été remplacé.

---

## ⚠️ Redirection de stderr (2)

Les erreurs utilisent un flux différent : stderr.

```
ls fichier_inexistant
```

Affiche :

```
ls: impossible d'accéder à 'fichier_inexistant'
```

Pour rediriger les erreurs :

```
ls fichier_inexistant 2> erreurs.log
```

### Schéma

```
stderr (2)
    |
    v
erreurs.log
```

---

## 📁 Séparer stdout et stderr

```
ls /etc fichier_inexistant > sortie.log 2> erreur.log
```

<table id="bkmrk-fichier-contenu-sort"><thead><tr><th>Fichier</th><th>Contenu</th></tr></thead><tbody><tr><td>sortie.log</td><td>Résultat normal</td></tr><tr><td>erreur.log</td><td>Messages d'erreur</td></tr></tbody></table>

---

## 🧠 Comprendre 2&gt;&amp;1

<div id="bkmrk-astuce-importantec%27e" style="border-left: 4px solid #2ecc71; padding: 10px; background: #f8fff8;">**Astuce importante**  
C'est probablement la syntaxe la plus utilisée dans les scripts Linux.</div>### Commande

```
commande > fichier.log 2>&1
```

### Décomposition

Cette partie :

```
> fichier.log
```

équivaut à :

```
1> fichier.log
```

Donc :

```
stdout --> fichier.log
```

Puis :

```
2>&1
```

signifie :

```
rediriger stderr vers le même emplacement que stdout
```

### Schéma

```
stdout (1) -----\
                 \
                  ---> fichier.log
                 /
stderr (2) -----/
```

### Résultat

```
commande > fichier.log 2>&1
```

Les sorties normales et les erreurs sont regroupées dans le même fichier.

---

## ⚠️ Pourquoi l'ordre est important ?

**Correct :**

```
commande > fichier.log 2>&1
```

**Incorrect :**

```
commande 2>&1 > fichier.log
```

<div id="bkmrk-attentionlinux-trait" style="border-left: 4px solid #e74c3c; padding: 10px; background: #fff8f8;">**Attention**  
Linux traite les redirections de gauche à droite.</div>Dans le second cas, stderr continue d'utiliser le terminal.

---

## 🚀 Syntaxe simplifiée : &amp;&gt;

Bash fournit un raccourci :

```
commande &> fichier.log
```

Équivalent à :

```
commande > fichier.log 2>&1
```

### Ajout dans le fichier

```
commande &>> fichier.log
```

---

## 🗑️ Comprendre /dev/null

<div id="bkmrk-information%2Fdev%2Fnull" style="border-left: 4px solid #3498db; padding: 10px; background: #f8f9fa;">**Information**  
/dev/null est la poubelle de Linux.</div>Tout ce qui est envoyé dans ce fichier disparaît immédiatement.

```
echo "test" > /dev/null
```

Aucun résultat.

### Ignorer les erreurs

```
commande 2>/dev/null
```

### Ignorer la sortie normale

```
commande >/dev/null
```

### Tout ignorer

```
commande >/dev/null 2>&1
```

### Schéma

```
stdout --------> /dev/null

stderr --------> stdout
                    |
                    v
               /dev/null
```

Rien ne s'affiche.

---

## 🫖 Comprendre la commande tee

La commande `tee` permet d'écrire à la fois :

- dans un fichier
- sur l'écran

### Exemple

```
ls | tee resultat.log
```

### Schéma

```
stdout
   |
   +------> écran
   |
   +------> resultat.log
```

L'utilisateur voit le résultat tout en conservant une trace dans un fichier.

---

## 🔐 Tee avec sudo

Cette commande échoue :

```
sudo echo "8.8.8.8 google" > /etc/hosts
```

Car la redirection est exécutée par le shell utilisateur avant sudo.

### Solution

```
echo "8.8.8.8 google" | sudo tee -a /etc/hosts
```

### Schéma

```
echo
 |
 v
sudo tee -a
 |
 +------> écran
 |
 +------> /etc/hosts
```

Ici, c'est bien tee qui écrit dans le fichier avec les privilèges root.

---

## 📋 Résumé rapide

<table id="bkmrk-syntaxe-action-comma"><thead><tr><th>Syntaxe</th><th>Action</th></tr></thead><tbody><tr><td>`commande > fichier`</td><td>stdout vers fichier</td></tr><tr><td>`commande >> fichier`</td><td>Ajouter stdout</td></tr><tr><td>`commande 2> fichier`</td><td>stderr vers fichier</td></tr><tr><td>`commande > fichier 2>&1`</td><td>stdout + stderr vers fichier</td></tr><tr><td>`commande &> fichier`</td><td>Version courte Bash</td></tr><tr><td>`commande >/dev/null`</td><td>Ignorer stdout</td></tr><tr><td>`commande 2>/dev/null`</td><td>Ignorer stderr</td></tr><tr><td>`commande >/dev/null 2>&1`</td><td>Tout ignorer</td></tr><tr><td>`commande | tee fichier`</td><td>Afficher + enregistrer</td></tr><tr><td>`commande | sudo tee -a fichier`</td><td>Afficher + enregistrer avec sudo</td></tr></tbody></table>

<div id="bkmrk-%C3%80-retenirles-4-synta" style="border-left: 4px solid #2ecc71; padding: 10px; background: #f8fff8;">**À retenir**  
Les 4 syntaxes les plus utilisées en administration Linux sont : - `commande > fichier.log 2>&1`
- `commande >> fichier.log 2>&1`
- `commande >/dev/null 2>&1`
- `commande | tee fichier.log`

</div>