OVH Cloud OVH Cloud

Echange de stdout et stderr

4 réponses
Avatar
Damien Wyart
J'essaie d'inverser stdout et stderr en passant par un fd 3, mais dans
le cas où la commande de départ contient un $(), ça ne fonctionne pas
comme attendu. Est-ce une limitation du shell ou peut-on passer outre ?

(echo $(ls titi) bonjour 3>&2 2>&1 1>&3 ) > errfile 2> outfile

L'idée est de récupérer titi bonjour dans outfile quand titi existe et
l'erreur dans errfile et bonjour dans outfile sinon. Tout ça en bash
(mais si un zshisme fait ça, je suis intéressé). Sinon je ferai ça en Perl...


Merci d'avance,

--
DW

4 réponses

Avatar
lhabert
Damien Wyart :

(echo $(ls titi) bonjour 3>&2 2>&1 1>&3 ) > errfile 2> outfile


Tes redirections « 3>&2 2>&1 1>&3 » s'appliquent au echo, pas à la commande
dans le « $() ». Il te faut mettre des redirections dans le « $() » aussi.

L'idée est de récupérer titi bonjour dans outfile quand titi existe et
l'erreur dans errfile et bonjour dans outfile sinon.


Mon dieu quelle horreur! Tu ne veux pas faire un « test -e » pour tester
l'existence du fichier?

Avatar
Stephane Chazelas
On Tue, 12 Sep 2006 19:28:55 +0200, Damien Wyart wrote:
J'essaie d'inverser stdout et stderr en passant par un fd 3, mais dans
le cas où la commande de départ contient un $(), ça ne fonctionne pas
comme attendu. Est-ce une limitation du shell ou peut-on passer outre ?

(echo $(ls titi) bonjour 3>&2 2>&1 1>&3 ) > errfile 2> outfile

L'idée est de récupérer titi bonjour dans outfile quand titi existe et
l'erreur dans errfile et bonjour dans outfile sinon. Tout ça en bash
(mais si un zshisme fait ça, je suis intéressé). Sinon je ferai ça en Perl...
[...]


{ { echo $(ls titi) bonjour; } 3>&2 2>&1 1>&3 3>&-; } > errfile 2> outfile

--
Stephane

Avatar
Damien Wyart
* Stephane Chazelas in fr.comp.os.unix:
{ { echo $(ls titi) bonjour; } 3>&2 2>&1 1>&3 3>&-; } > errfile 2> outfile


Merci bien.

--
DW

Avatar
Damien Wyart
* (Luc Habert) in fr.comp.os.unix:
Tes redirections « 3>&2 2>&1 1>&3 » s'appliquent au echo, pas à la commande
dans le « $() ». Il te faut mettre des redirections dans le « $() » aussi.


Ok. Merci !

L'idée est de récupérer titi bonjour dans outfile quand titi existe et
l'erreur dans errfile et bonjour dans outfile sinon.


Mon dieu quelle horreur! Tu ne veux pas faire un « test -e » pour tester
l'existence du fichier?


C'était juste un exemple bricolé rapidement pour montrer l'idée, bien
sûr dans ce cas précis, on peut faire nettement plus propre...

--
DW