OVH Cloud OVH Cloud

Bash : Redirection

7 réponses
Avatar
Hugolino
Bonjour

Direct de la page de manuel de GNU bash 2.05b...
8<----------------------------------------------------------------------
Remarquez que l'ordre des redirections est important. Par exemple, la
commande

ls > liste_répertoires 2>&1

redirige a la fois la sortie standard et la sortie d'erreur vers le
fichier liste_répertoires, alors que la commande

ls 2>&1 > liste_répertoires

ne redirige que la sortie standard vers le fichier liste_répertoires,
car la sortie d'erreur a été renvoyée vers la sortie standard avant que
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
celle-ci ne soit redirigée vers liste_répertoires.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
8<----------------------------------------------------------------------


Justement j'aurais cru qu'il fallait envoyer stderr sur stdout *AVANT*
d'envoyer stdout vers le fichier liste_répertoires. Ne parait-il pas
logique de regrouper les deux flux de sortie avant d'envoyer le tout
dans un fichier ?


Merci de toute explication


Je viens d'acheter le livre de C. Blaess "Scripts sous Linux" et je
potasse le chapitre 3 (page 92 et suivantes) mais je n'arrive pas à
comprendre le Schmilblick...


--
> c'était pour moi, je ne me risquerais pas à faire du traitement de texte
> avec xemacs ou vim, à moins bien sûr de coupler le tout à TeX/LaTeX.
je pourrai savoir comment on fait cela
-+- LJ in Guide du linuxien pervers - "savoir se donner des objectifs."

7 réponses

Avatar
Unknown
Justement j'aurais cru qu'il fallait envoyer stderr sur stdout *AVANT*
d'envoyer stdout vers le fichier liste_répertoires. Ne parait-il pas
logique de regrouper les deux flux de sortie avant d'envoyer le tout
dans un fichier ?


traduit > fic par fopen(fic) et le 2>&1 par dup(1) tu comprends de suite.

Avatar
Bruno Jargot
In article ,
Hugolino wrote:

ls > liste_répertoires 2>&1


la partie ( > liste_répertoires ) redirige la sortie standard vers le
fichier liste_répertoires.
La partie ( 2>&1) redirige la sortie erreur vers le même endroit que la
sortie standard, soit vers le fichier liste_répertoires.

Donc, au final, stdout et stderr sont redirigés vers le fichier
liste_répertoires.

ls 2>&1 > liste_répertoires


La partie ( 2>&1) redirige la sortie erreur vers le même endroit que la
sortie standard, soit vers le terminal.
La partie (> liste_répertoires) redirige la sortie standard vers le
fichier liste_répertoires.

Donc au final, stderr est redirigé vers le terminal et stdout vers le
fichier liste_répertoires.


Justement j'aurais cru qu'il fallait envoyer stderr sur stdout


On ne redirige pas stderr vers stdout mais vers le même endroit que
stdout. nuance de taille.

Avatar
Hugolino
Le Fri, 04 Jun 2004 18:09:28 +0200, Unknown a écrit:
traduit > fic par fopen(fic) et le 2>&1 par dup(1) tu comprends de suite.


Peux-tu développer, stp ?
(Suis pas developpeur justement (même si je fais semblant de savoir ce
qu'est stderr et stdout))

--
Hugo NPN (i --> ee)
Ce programme ne gère pas le "groupe wheel" utilisé pour restreindre
l'accès par su au compte Super-Utilisateur, car il pourrait aider des
administrateurs systèmes fascistes à disposer d'un pouvoir incontrôlé
sur les autres utilisateurs. (man su)

Avatar
Hugolino
Le Fri, 04 Jun 2004 19:25:31 +0200, Bruno Jargot a écrit:
In article ,
Hugolino wrote:

ls > liste_répertoires 2>&1


la partie ( > liste_répertoires ) redirige la sortie standard vers le
fichier liste_répertoires.
La partie ( 2>&1) redirige la sortie erreur vers le même endroit que la
sortie standard, soit vers le fichier liste_répertoires.


OK (quoique je pige pas le sens de "vers le même endroit")


Donc, au final, stdout et stderr sont redirigés vers le fichier
liste_répertoires.


OK


ls 2>&1 > liste_répertoires


La partie ( 2>&1) redirige la sortie erreur vers le même endroit que la
sortie standard, soit vers le terminal.


Ah ? (mais le tout n'est-il pas redirigé vers liste_répertoire ?)


La partie (> liste_répertoires) redirige la sortie standard vers le
fichier liste_répertoires.


Pourquoi seulement stdout ? (Puisque j'ai mergé stderr et stdout avant ?)


Donc au final, stderr est redirigé vers le terminal et stdout vers le
fichier liste_répertoires.


Ah ?


Justement j'aurais cru qu'il fallait envoyer stderr sur stdout


On ne redirige pas stderr vers stdout mais vers le même endroit que
stdout. nuance de taille.


OK, j'ai touché le point G :) Peux-tu développer cette "nuance de
taille" ?


Hugo (still a newbie)


--
<nbc> dev/hda10: Invalid argument passed to ext2 library while setting
<nbc> GRRR, me faire ca a moi a cette heure la juste avant le grog du soir
<Ol> trooooonçoonneuuuuse
-+- Ol in Guide du linuxien pervers - "Monsieur connait ses classiques."


Avatar
Unknown
Le Sat, 05 Jun 2004 03:54:05 +0200, Hugolino a écrit :

Le Fri, 04 Jun 2004 18:09:28 +0200, Unknown a écrit:
traduit > fic par fopen(fic) et le 2>&1 par dup(1) tu comprends de suite.


Peux-tu développer, stp ?
(Suis pas developpeur justement (même si je fais semblant de savoir ce
qu'est stderr et stdout))


si tu veux on va prendre comme image un entonnoir de l'eau et un bouteille.
Un fichier = une bouteille.
Un entonnoir = une redirection
de l'eau = tes datas.

quand tu fais > fichier tu dis : je mets l'entonnoir stdout au dessus de
la bouteille étiquettée fichier.
apres comme au dessus d'une bouteille tu ne peux avoir qu'un seul
entonnoir (sinon tu en fous partout) quand tu fais 2>&1 tu dis déverse
stderr dans l'entonnoir stdout afin que tout aille dans la bouteille
fichier.
donc n'oublie pas que le shell interprete ce que tu tapes, du coup si tu
dis 2>&1 > fichier le shell prend l'entonnoir stderr et le positionne au
dessus de l'entonnoir stdout qui pointe par defaut sur le fichier "écran"
ensuite il déplace l'entonnoir stdout vers "fichier" mais sans déplacer
stderr. résultat l'entonnoir stderr déversera tout dans la bouteille
"écran" et stdout dans la bouteille "fichier"


Avatar
Bruno Jargot
In article ,
Hugolino wrote:

Le Fri, 04 Jun 2004 19:25:31 +0200, Bruno Jargot a écrit:
In article ,
Hugolino wrote:

ls > liste_répertoires 2>&1


la partie ( > liste_répertoires ) redirige la sortie standard vers le
fichier liste_répertoires.
La partie ( 2>&1) redirige la sortie erreur vers le même endroit que la
sortie standard, soit vers le fichier liste_répertoires.


OK (quoique je pige pas le sens de "vers le même endroit")


Une sortie est redirigée vers quelque part. Ce quelque part peut être un
fichier texte, un terminal, ...
Dire que la sortie erreur est redirigée vers le même endroit que la
sortie standard signifie :
- Quel est la destination de la sortie standard ? :
le fichier liste_répertoires dans ce cas.
- Alors la sortie erreur est redirigée vers liste_répertoires.

Donc, au final, stdout et stderr sont redirigés vers le fichier
liste_répertoires.


OK

ls 2>&1 > liste_répertoires


La partie ( 2>&1) redirige la sortie erreur vers le même endroit que la
sortie standard, soit vers le terminal.


Ah ? (mais le tout n'est-il pas redirigé vers liste_répertoire ?)


On lit *de gauche à droite* :
Au moment ou 2>&1 est exécuté, la sortie standard est dirigé vers le
terminal. Donc la sortie erreur est redirigé vers le terminal.
*Après*, la sortie standard est redirigé vers le fichier
liste_répertoire. C'est seulement la sortie standard qui est redirigé.
Il n'existe *aucun lien* entre la sortie erreur et la sortie standard !
Donc il n'y a strictement aucune raison de rediriger la sortie erreur
quand on redirige la sortie standard.


La partie (> liste_répertoires) redirige la sortie standard vers le
fichier liste_répertoires.


Pourquoi seulement stdout ? (Puisque j'ai mergé stderr et stdout avant ?)


Non, tu n'as rien mergé du tout. mauvaise interprétation.

Donc au final, stderr est redirigé vers le terminal et stdout vers le
fichier liste_répertoires.


Ah ?


Justement j'aurais cru qu'il fallait envoyer stderr sur stdout


On ne redirige pas stderr vers stdout mais vers le même endroit que
stdout. nuance de taille.


OK, j'ai touché le point G :) Peux-tu développer cette "nuance de
taille" ?


La commande 2>&1 ne signifie pas : stderr est redirigé vers stdout ad
vitam eternam.
Elle signifie : Tu prends l'endroit vers lequel stdout est actuellement
redirigé. Tu rediriges stderr vers cet endroit.

Si on déplace stdout *après*, cela n'a strictement aucune influence sur
stderr. C'est trop tard.



Avatar
Stephane Chazelas
2004-06-05, 08:32(+02), Unknown:
Le Sat, 05 Jun 2004 03:54:05 +0200, Hugolino a écrit :

Le Fri, 04 Jun 2004 18:09:28 +0200, Unknown a écrit:
traduit > fic par fopen(fic) et le 2>&1 par dup(1) tu comprends de suite.


Peux-tu développer, stp ?
(Suis pas developpeur justement (même si je fais semblant de savoir ce
qu'est stderr et stdout))


si tu veux on va prendre comme image un entonnoir de l'eau et un bouteille.
Un fichier = une bouteille.
Un entonnoir = une redirection
de l'eau = tes datas.


C'est une mauvaise image, qui n'explique pas:

cmd 1> a 2>&1 1> b

On pourrait rajouter un concept de tuyau (d'adaptation) entre
les bouteilles et l'entonnoir.

"1> a", ouvre la bouteille "a"
met un tuyau (un file handle) dessus et redirige
l'entonnoir (file descriptor) 1 sur la bouteille

"2>&1" regarde sur quel tuyau l'entonnoir 1 est branché et
redirige l'entonnoir 2 dessus (il y a deux entonnoirs sur ce
premier tuyau).

"1> b" ouvre une autre bouteille "b", met un nouveau tuyau
dessus et redirige l'entonnoir 1 sur ce nouveau tuyau.

--
Stephane