# Commande Pipe couplée avec la commande cat

**URL:** <https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273>\
**Category:** Support Debian\
**Created:** [Octobre 13, 2022, 12:14 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273 "2022-10-13T12:14:25Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Octobre 13, 2022, 12:14 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/1 "2022-10-13T12:14:25Z")

</div>

bonjour,

voyant très souvent cette commande j’ai voulu en savoir un peu plus . Basiquement c’est assez simple sauf que je bute sur un exmple précis qui me bloque :

```auto
mm@Xfce:~$ rm . .. 2>t.txt | cat t.txt

```

pourtant t.txt n’est pas vide puisque

```auto
mm@Xfce:~$ cat t.txt
rm: impossible de supprimer '.': est un dossier
rm: impossible de supprimer '..': est un dossier

```

par contre dans l’exemple ci-dessous la sortie est correcte

```auto
mm@Xfce:~$ printf %b 'hello V.G' "\n" 'hello D.S' "\n" > t.txt | cat t.txt 
hello V.G
hello D.S

```

question : pourquoi la ligne

```nohighlight
rm . .. 2>t.txt | cat t.txt

```

qui devrait afficher le texte contenu dans t.txt ne fonctionne pas alors que

```nohighlight
mm@Xfce:~$ printf %b 'hello V.G' "\n" 'hello D.S' "\n" > t.txt | cat t.txt

```

affiche bien le contenu du fichier t.txt ?

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Octobre 13, 2022, 2:18 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/2 "2022-10-13T14:18:41Z")

</div>

La partie _rm_ qu’on a pas en entier envoie les éventuels retours d’affichage dans le fichier t.txt.  
Le cat affichant le contenu.  
en fait c’est inélégant, car inutile, les affichages provoqués par rm sont directement visible, donc pas besoin de les envoyer dans un fichier pour immédiatement l’afficher.

je ne sais pas où tu as trouvé ça, mais ça ne se fait pas vraiment.

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Octobre 13, 2022, 2:29 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/3 "2022-10-13T14:29:03Z")

</div>

> [@Zargos](#):
>
> je ne sais pas où tu as trouvé ça, mais ça ne se fait pas vraiment.

les 2 lignes de commande sont faites maison , pas étonnant que ça pique pour un professionnel . Leur unique but : essayer les 2 commandes **|** et **cat** avec en plus la sortie du fichier **stderr** que je viens de découvrir , alors je me suis servi de la 1ère commande récente qui m’a sorti une erreur et qui m’est venue à l’esprit .

et ce que j’ai trouvé bizarre c’est que si je redirige la sortie de **stdout** ça fonctionne :

```auto
mm@Xfce:~$ rm . .. 1> t.txt | cat t.txt
rm: impossible de supprimer '.': est un dossier
rm: impossible de supprimer '..': est un dossier

```

mais bon c’est juste par curiosité , je ne vais pas me focaliser là-dessus .

merci pour la réponse .

---

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Octobre 13, 2022, 2:58 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/4 "2022-10-13T14:58:18Z")

</div>

Essaye plutot un truc du genre:

```auto
ip -o link show | grep -v '1\: lo\:' | cut -d ':' -f2 | sed "s/\s//g"

```

Qui te donnera les interfaces aures que _lo_ sans espaces à la fin ou au début. 😉

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Octobre 13, 2022, 3:02 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/5 "2022-10-13T15:02:31Z")

</div>

> [@zao](#):
>
> … si je redirige la sortie de **stdout** ça fonctionne : …

Ça dépends de ce que tu veux dire par : _ça fonctionne_

```plaintext
rm . .. 1> t.txt | cat t.txt

```

Dans le cas de la ligne de commandes ci-dessus, comme le message d’erreur retourné dans le flux `stderr` par la commande `rm` n’est plus redirigé, il s’affiche dans la console.

Mais le fichier `t.txt` sera vidé de ce qu’il contenait (s’il contenait déjà autre chose)  
puisque le flux `stdout` de la commande `rm` n’aura rien retourné.

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Octobre 13, 2022, 3:04 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/6 "2022-10-13T15:04:59Z")

</div>

> [@Zargos](#):
>
> Essaye plutot un truc du genre:
> 
> ```auto
> ip -o link show | grep -v '1\: lo\:' | cut -d ':' -f2 | sed "s/\s//g"
> 
> ```
> 
> Qui te donnera les interfaces aures que _lo_ sans espaces à la fin ou au début. 😉

`awk` peut avantageusement remplacer les combinaisons de `grep` et `cut`:

```auto
ip -o link | awk -F": " '!/lo/ {print $2}'

```

devrait donner à peu près la même chose

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Octobre 13, 2022, 3:06 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/7 "2022-10-13T15:06:30Z")

</div>

> [@anon29980398](#):
>
> Mais le fichier `t.txt` sera vidé de ce qu’il contenait (s’il contenait déjà autre chose)  
> puisque le flux `stdout` de la commande `rm` n’aura rien retourné.

pour être sûr je vais supprimer le fichier avant de réessayer :

```auto
mm@Xfce:~$ rm t.txt
mm@Xfce:~$ rm . .. 1> t1.txt | cat t1.txt
rm: impossible de supprimer '.': est un dossier
rm: impossible de supprimer '..': est un dossier

```

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Octobre 13, 2022, 3:11 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/8 "2022-10-13T15:11:23Z")

</div>

> [@zao](#):
>
> ```auto
> mm@Xfce:~$ rm . .. 1> t1.txt | cat t1.txt
> rm: impossible de supprimer '.': est un dossier
> rm: impossible de supprimer '..': est un dossier
> 
> ```

Ton fichier `t1.txt` est bien vide, comme l’a écrit MicP, mais `cat` concatène ce fichier (vide) avec l’erreur standard de la commande `rm`

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Octobre 13, 2022, 3:19 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/9 "2022-10-13T15:19:18Z")

</div>

```nohighlight
michel@deb114x:~$ echo "contenu de t1.txt" > t1.txt
michel@deb114x:~$ echo "contenu de t2.txt" > t2.txt
michel@deb114x:~$ cat t1.txt t2.txt
contenu de t1.txt
contenu de t2.txt
michel@deb114x:~$ rm -v . .. 1> t1.txt | cat t2.txt
contenu de t2.txt
rm: impossible de supprimer '.': est un dossier
rm: impossible de supprimer '..': est un dossier
michel@deb114x:~$ cat t1.txt
michel@deb114x:~$ cat t2.txt
contenu de t2.txt
michel@deb114x:~$ 

```

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Octobre 13, 2022, 3:21 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/10 "2022-10-13T15:21:32Z")

</div>

> [@Sputnik93](#):
>
> Ton fichier `t1.txt` est bien vide, comme l’a écrit MicP, mais `cat` concatène ce fichier (vide) avec l’erreur standard de la commande `rm`

ok , voilà l’explication = concaténation . 1&2 en somme . J’ai vu passer un truc comme ça dans une page sur ces fichiers virtuels . Je n’avais pas du tout compris la 1ère réponse de @anon29980398 .

merci bien pour la réponse .

---

<div class="post-metadata">

**Author:** ![Sputnik93](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/s/35a633/32.png) [@Sputnik93](https://www.debian-fr.org/u/Sputnik93)\
**Post date:** [Octobre 13, 2022, 3:22 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/11 "2022-10-13T15:22:28Z")

</div>

> [@anon29980398](#):
>
> ```auto
> michel@deb114x:~$ rm -v . .. 1> t1.txt | cat t2.txt
> contenu de t2.txt
> rm: impossible de supprimer '.': est un dossier
> rm: impossible de supprimer '..': est un dossier
> 
> ```

Tout à fait.  
Le contenu de `t1.txt` est écrasé par la sortie standard (vide) de la commande `rm`. Et `cat` concatène ensuite t2 avec l’erreur standard de la commande `rm`

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Octobre 13, 2022, 3:32 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/12 "2022-10-13T15:32:37Z")

</div>

> [@anon29980398](#):
>
> Ça dépends de ce que tu veux dire par : _ça fonctionne_
> 
> ```auto
> 
> ```

je viens enfin de comprendre cette réserve .

merci pour ces explications .

du manuel à propos de la commande **cat** :

DESCRIPTION  
Concaténer le ou les FICHIER(s) sur la sortie standard.

```
   L'entrée standard est lue quand FICHIER est omis ou quand FICHIER vaut
   « - ».

```

que signifie le tiret (?) **« - »** dans ce contexte ?

---

<div class="post-metadata">

**Author:** ![pled](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pled/32/11791_2.png) [@pled](https://www.debian-fr.org/u/pled)\
**Post date:** [Octobre 13, 2022, 3:46 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/13 "2022-10-13T15:46:34Z")

</div>

Il me semble que ton problème vient (entre autres) de l’utilisation du pipe avec les redirections. Ce qui n’a pas l’air trivial à part pour stdout.  
Tu peux lire [cette page](https://linux-attitude.fr/post/utiliser-le-pipe-sur-stderr), c’est intéressant (et pas simple).  
Il y est dit que :

> Le stdin du côté droit du pipe ‹&nbsp;|&nbsp;› prend toujours sa source du stdout du côté gauche

Et donc si je comprends bien, quand tu tapes :

```auto
rm . .. 2>t.txt | cat t.txt

```

Il n’y a rien dans le `stdout` du côté gauche, et donc le pipe ne peut fonctionner. De plus, si tu cherches à enchaîner deux commandes, ce n’est pas un pipe (|) qu’il faut utiliser, mais un point-virgule (😉 :

```auto
rm . .. 2>t.txt ; cat t.txt

```

Et là ça fonctionne.

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Octobre 13, 2022, 3:57 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/14 "2022-10-13T15:57:50Z")

</div>

> [@pled](#):
>
> l me semble que ton problème vient (entre autres) de l’utilisation du pipe avec les redirections. Ce qui n’a pas l’air trivial à part pour stdout.  
> Tu peux lire [cette page](https://linux-attitude.fr/post/utiliser-le-pipe-sur-stderr), c’est intéressant (et pas simple).

effectivement ça n’a pas l’air évident évident et je vais laisser ça de côté car de toute façon ces fichiers virtuels ne me sont pas du tout indispensables : je connais leur existence et ça suffira .

en conclusion : pour tester ces deux commandes c’était l’exemple à ne surtout pas choisir . pff…  
merci pour l’info .

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Octobre 13, 2022, 4:04 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/15 "2022-10-13T16:04:44Z")

</div>

> [@zao](#):
>
> … que signifie le tiret (?) « - » dans ce contexte ?…

Dans ce contexte, le tiret représente l’entrée standard :

```plaintext
michel@deb114x:~$ echo "contenu de t1.txt" > t1.txt
michel@deb114x:~$ echo "t2.txt vers stdin de la commande qui sera après le pipe => sera remplacé par le tiret" > t2.txt
michel@deb114x:~$ cat t1.txt
contenu de t1.txt
michel@deb114x:~$ cat t2.txt
t2.txt vers stdin de la commande qui sera après le pipe => sera remplacé par le tiret
michel@deb114x:~$ #############################################
michel@deb114x:~$ 
michel@deb114x:~$ cat t2.txt | cat t1.txt
contenu de t1.txt
michel@deb114x:~$ 
michel@deb114x:~$ cat t2.txt | cat
t2.txt vers stdin de la commande qui sera après le pipe => sera remplacé par le tiret
michel@deb114x:~$ 
michel@deb114x:~$ #############################################
michel@deb114x:~$ cat t2.txt | cat - t1.txt
t2.txt vers stdin de la commande qui sera après le pipe => sera remplacé par le tiret
contenu de t1.txt
michel@deb114x:~$ 
michel@deb114x:~$ cat t2.txt | cat t1.txt -
contenu de t1.txt
t2.txt vers stdin de la commande qui sera après le pipe => sera remplacé par le tiret
michel@deb114x:~$ 

```

---

<div class="post-metadata">

**Author:** ![PascalHambourg](https://www.debian-fr.org/user_avatar/www.debian-fr.org/pascalhambourg/32/5837_2.png) [@PascalHambourg](https://www.debian-fr.org/u/PascalHambourg)\
**Post date:** [Octobre 13, 2022, 5:13 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/16 "2022-10-13T17:13:36Z")

</div>

> [@Sputnik93](#):
>
> `cat` concatène ce fichier (vide) avec l’erreur standard

cat ne concatène rien du tout. Comme l’a écrit @anon29980398, il affiche le contenu du fichier passé en argument. L’affichage des messages d’erreurs est dû à la sortie d’erreur de rm qui n’est pas redirigée.

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Octobre 13, 2022, 7:58 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/17 "2022-10-13T19:58:02Z")

</div>

J’ajoute que, dans la ligne de commandes suivante :

```nohighlight
rm . .. 2>t.txt | cat t.txt

```

le _pipe_ connecte :

- le flux `stdout` de la commande `rm`
- au flux `stdin` de la commande `cat`

Le _pipe_ ne prends pas en compte le flux `stderr` de la commande `rm`

Mais, dans ce contexte ( _…impossible de supprimer …_) :

- La commande `rm` ne retourne rien du tout par son flux `stdout` =\> donc la commande `pipe` n’aura rien à transmettre au flux `stdin` de la commande `cat`
- de plus, pour que la commande `cat` lise son flux `stdin` il faudrait qu’on ne lui ait donné aucun nom de fichier, ou bien qu’on lui spécifie de lire aussi son flux `stdin` en ajoutant un **tiret** dans la liste des noms de fichiers à con **cat** éner.

---

<div class="post-metadata">

**Author:** ![zao](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/z/ce7236/32.png) [@zao](https://www.debian-fr.org/u/zao)\
**Post date:** [Octobre 14, 2022, 3:58 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/18 "2022-10-14T03:58:48Z")

</div>

> [@anon29980398](#):
>
> le _pipe_ connecte :
> 
> - le flux `stdout` de la commande `rm`
> - au flux `stdin` de la commande `cat`
> 
> Le _pipe_ ne prends pas en compte le flux `stderr` de la commande `rm`
> 
> Mais, dans ce contexte ( _…impossible de supprimer …_ ) :
> 
> - La commande `rm` ne retourne rien du tout par son flux `stdout` =\> donc la commande `pipe` n’aura rien à transmettre au flux `stdin` de la commande `cat`

même si je ne comprends pas pourquoi la transmission des flux se passe ainsi , ça explique le résultat observé . Trop de trous dans la raquette pour que je sois capable de suivre le chemin emprunté par les flux de données . Sans le savoir j"ai visé trop haut .

Mais en séparant les flux je vois mieux ce qu’il se passe , transmissions avec **pipe** non comprises :

```auto
mm@Xfce:~$ rm . .. 1>t1.txt 2>t2.txt
mm@Xfce:~$ cat t1.txt
mm@Xfce:~$ cat t2.txt
rm: impossible de supprimer '.': est un dossier
rm: impossible de supprimer '..': est un dossier

```

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Octobre 14, 2022, 4:49 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/19 "2022-10-14T04:49:00Z")

</div>

Bonjour

Une page web (récemment mise à jour par l’auteur) très bien faite  
concernant les _redirections_ et le _pipe_ :  
[Introduction à la programmation en Bash → #5 Redirections élémentaires](http://aral.iut-rodez.fr/fr/sanchis/enseignement/bash/ch05-Redirections-elementaires.html)

* * *

Et c’est même le document en entier qui vaut le coup d’être lu :  
[iut-rodez.fr : Introduction à la programmation en Bash (Eric Sanchis)](http://aral.iut-rodez.fr/fr/sanchis/enseignement/bash)  
et si besoin, tu trouveras dans ces pages web un lien vers un fichier pdf

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Octobre 14, 2022, 6:53 UTC](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273/20 "2022-10-14T06:53:14Z")

</div>

Je pense que c’est plutot  
`rm quelquechose 2> /tmp/glop || cat /tmp/glop`  
qui efface le qquelkquechose et affiche les erreurs si il y en a eu tout en les conservant dans un fichier.

[Page suivante](https://www.debian-fr.org/t/commande-pipe-couplee-avec-la-commande-cat/87273.md?page=2)
