[PERL] - diff d'un sortie d'erreur

[Résolu/Fermé]
Signaler
Messages postés
24
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
23 août 2008
-
 aa -
Bonjour,
et oui c'est encore moi. J'ai un nouveau probleme de diffe pour les sortie. Je m'explique:
On n'a aider precedemment sur les diff des sortie standard et ca marche nikel mais maintenant j'essaye de diffe la sortie d'erreur que je renvoi avec fprintf(stderr, ...) en C. Je fait mes test en perl et je sais miantenant qu'avec qx{} on peux diffe la sortie standard, mais existe-t-il une commande pour la sortie d'erreur??

voila ce que je veux diffe:

-->EverDaft<-- ./42sh --coucou

42sh: --coucou: invalid option
Usage: 42sh [42sh option] [option] script-file ...
42sh options:
-c <command>
[-+]O
--norc
--ats-print
--version

cf:

-->EverDaft<-- bash --coucou
bash: --coucou: invalid option
Usage: bash [GNU long option] [option] ...
bash [GNU long option] [option] script-file ...
GNU long options:
--debug
--dump-po-strings
--dump-strings
--help
--init-file
--login
--noediting
--noprofile
--norc
--posix
--rcfile
--restricted
--verbose
--version
--wordexp
Shell options:
-irsD or -c command or -O shopt_option (invocation only)
-abefhkmnptuvxBCHP or -o option

Merci a tous ;)

10 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
Salut,

la sortie des erreurs se fait sur le descripteur 2

peut être qu'il faut faire une rédirection dans ton code pour le descripteur STDERR

quelque chose de genre
2>fichier.error

Messages postés
24
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
23 août 2008
1
voila mon code:

my $prm = "../42sh -coucou\n";
my $diffe = "42sh: -c: invalid option
Usage: 42sh [42sh option] [option] script-file ...
42sh options:
-c <command>
[-+]O
--norc
--ats-print
--version\n";

if (qx{$pgm} eq "$diffe")
{print RED "OK\n";}

Je ne sais pas ou est ce que je peux rediriger le flux vers la sortie d'erreur :S.
Si tu as une idee...
Messages postés
18247
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
2 août 2021
5 333
print STDERR "message d'erreur"
Messages postés
24
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
23 août 2008
1
Desole mais en fait ca n'est pas bon du tout.
Il ne me diff plus rien du tout et ma met toujours ok meme quand ca ne l'est pas :S
J'ai essayer le print STDERR et ca n'est pas concluant... Si tu as d'autre idee...
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
Regarde ça
lami20j@debian:~/trash$ cat everdraft.pl
#!/usr/bin/perl
use strict;use warnings;
my $cmd = qx/sh --version | head -1/;
print "$cmd\n";
if (qx/sh --version --dsfsd 2>everdraft.error | head -1/ eq "GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)\n"){
        print "OK\n";
}else{
        print "KO\n";
}
__END__

lami20j@debian:~/trash$ perl everdraft.pl
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)

KO
lami20j@debian:~/trash$ cat everdraft.error
sh: --dsfsd: invalid option
Usage:  sh [GNU long option] [option] ...
        sh [GNU long option] [option] script-file ...
GNU long options:
        --debug
        --debugger
        --dump-po-strings
        --dump-strings
        --help
        --init-file
        --login
        --noediting
        --noprofile
        --norc
        --posix
        --protected
        --rcfile
        --restricted
        --verbose
        --version
        --wordexp
Shell options:
        -irsD or -c command or -O shopt_option          (invocation only)
        -abefhkmnptuvxBCHP or -o option
lami20j@debian:~/trash$
Messages postés
24
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
23 août 2008
1
J'ai finalement reussit a trouver la solution en m'inspirant de se que tu m'a dit:

open(STDERR, ">output.txt") or die "Impossible d’ouvrir output.txt en écriture : $!";
open(REF, ">ref.txt") or die "Impossible d’ouvrir output.txt en écriture : $!";

print STDERR qx{$pgm[$i]};
print REF "$diffe[$i]";

qx{diff -qu "ref.txt" "output.txt"};
$var = qx{echo $?};

if ($var == 0)
{
print BLUE "OK";
}
else
{
print RED "KO";
}
voila.
Encore merci pour tes conseils
Bonjour,
j'aimerai bien savoir comment t'as reussi a faire des tests sur des programmes C avec perl.
surtout pour des programme qui se lance comme le shell enfin qui attende qu'on leur donne des infos ou des commands.
as tu utilise le module test::more ou encore swig .. ?

merci bcp.
je creerai un topic pour cela si j'ai pas de reponse.
Bonjour,
j'aimerai bien savoir comment t'as reussi a faire des tests sur des programmes C avec perl.
surtout pour des programme qui se lance comme le shell enfin qui attende qu'on leur donne des infos ou des commands.
as tu utilise le module test::more ou encore swig .. ?

merci bcp.
je creerai un topic pour cela si j'ai pas de reponse.
Messages postés
24
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
23 août 2008
1
Salut,
comme je suis un gros debutant en perl je sais vraiment pas de quoi tu parles lol.
Pour faire mes tests je creer un binaire et je le lance a partir de mon script de test.
Pour le lancer j'utilise la commande qx{}.
Si tu veus regarde cet exemple:

my $test = "monbinaire {arguments ou options}";
my $refout = "(sortie attendue)";
my $referr = "(sortie attendue)";

open(OUT, ">ref.out") or die "Impossible d’ouvrir ref.out en écriture : $!";
open(ERR, ">ref.err") or die "Impossible d’ouvrir ref.err en écriture : $!";
print OUT "$refout";
print ERR "$referr";

qx{$test] > monbinaire.out 2> monbinaire.err};

qx{diff -qu "ref.out" "42sh.out" > diff.out};

Voila.
Si tu ne comprend pas ce ke je fais demainde moi plus d'explication.
J'espere que j'ai pu t'aider
A plus
Bonjour,

Merci de ta reponse, comme je vois que ton binaire est un shell (42sh tres connu !) et bien tu te rapproche de ce que je veux faire, je t'explique :
le but des tests surtout pour la recette c'est de balancer des commandes a ton shell puis de faire un diff sur le fichier qui contient les resultats attendus avec la sortie de ton binaire, donc pour moi j'imagine que pour chaque commande tu creera un fichier, par exemple ls.shell dans lequel tu met le resultat du ls de bash puis un autre ls.MyShOut qui contiendera la sortie de ton binaire puis tu utilisera le module File::Compare pour le diff.
C'est vraiment ce que j'ai envie de faire avec mon binaire et pour etre plus clair :
Je veux, en perl, lancer bash, lui passer une commande puis l'enregistrer dans un fichier.
donc lancer bash/zsh/tsh/42sh/monBinaire (thread, fork ce que vous voulez) et lui balancer des comandes
c'est la grande difficulte pour moi :D

et utilises le module test::More pour tes tests c bcp plus sympa, sinon merci encore pour ton tres bon exemple.

aa+