OVH Cloud OVH Cloud

Exécution de commande: récupérer stderr

2 réponses
Avatar
Yves Martin
Bonjour,

Sur unix, j'aimerai récupéré stdout et stderr d'une commande exécutée de cette
façon:

my $checkDpkg = `dpkg -S $aFile 2>&1`;

mais visiblement cela ne fonctionne pas: stdout est bien dans la variable,
mais pas stderr.

Comment dois-je m'y prendre ?
Merci d'avance
--
Yves Martin

2 réponses

Avatar
Paul Gaborit
À (at) Tue, 14 Feb 2006 14:02:58 +0100,
Yves Martin écrivait (wrote):
Sur unix, j'aimerai récupéré stdout et stderr d'une commande
exécutée de cette façon:

my $checkDpkg = `dpkg -S $aFile 2>&1`;

mais visiblement cela ne fonctionne pas: stdout est bien dans la
variable, mais pas stderr.

Comment dois-je m'y prendre ?


C'est pourtant une bonne méthode (en passant par 2>&1)...

Êtes-vous sûr que votre command n'écrit que sur stdout et stderr ?
Certaines commandes utilisent directement le terminal courant ou
passent par d'autres moyens encore moins orthodoxes... D'autres
changent leur comportement selon l'environnement (lancée depuis un
shell ou non).

Pour tester, lancez la commande (sans passer par Perl) en faisant :

% dpkg -S unTruc > /dev/null 2>&1

et voyez si elle continue à vous afficher quelque chose.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Yves Martin
Paul Gaborit writes:

À (at) Tue, 14 Feb 2006 14:02:58 +0100,
Yves Martin écrivait (wrote):
Sur unix, j'aimerai récupéré stdout et stderr d'une commande
exécutée de cette façon:

my $checkDpkg = `dpkg -S $aFile 2>&1`;

mais visiblement cela ne fonctionne pas: stdout est bien dans la
variable, mais pas stderr.

Comment dois-je m'y prendre ?


C'est pourtant une bonne méthode (en passant par 2>&1)...

Êtes-vous sûr que votre command n'écrit que sur stdout et stderr ? Certaines
commandes utilisent directement le terminal courant ou passent par d'autres
moyens encore moins orthodoxes... D'autres changent leur comportement selon
l'environnement (lancée depuis un shell ou non).

Pour tester, lancez la commande (sans passer par Perl) en faisant :

% dpkg -S unTruc > /dev/null 2>&1

et voyez si elle continue à vous afficher quelque chose.


Effectivement dpkg et apt sont des outils qui semblent contrôler leur
terminal de sortie... (je les lance parfois avec ssh -T -oBatchMode=yes et on
peut constater qu'ils ne sont pas à l'aise)

Dans le shell, en tout cas, il n'y pas de doute la ligne en cas d'absence
d'un fichier sort dans stderr. En cas de présence du fichier, sur stdout.

J'ai finallement utilisé le code de retour (0 => présent, 1 => absent) avec
la fonction du package POSIX: WEXITSTATUS($CHILD_ERROR)

Après avoir encore creusé un peu... la ligne stderr sort bien dans Perl,
c'est surement mon expression régulière qui devait être mauvaise. Bref, une
bêtise.

Merci pour votre aide
--
Yves Martin