System et Exec
Le
Stéphane Müller
Bonjour,
J'ai le script perl essai.pl suivant:
print "++ system ++";
system @ARGV;
print "++ exec ++";
exec @ARGV;
J'ai le fichier arg.bat suivant:
@echo off
echo 1: %1
echo 2: %2
echo 3: %3
Le résultat de la commande:
C:\Tmp>perl essai.pl arg.bat -p"Mon repertoire" -d
est le suivant:
++ system ++
1: "-pMon repertoire"
2: -d
3:
++ exec ++
C:\Tmp>1: -pMon
2: repertoire
3: -d
Pourquoi les arguments sont-ils correctement interprétés par la
commande system alors que ce n'est pas le cas par exec ?
Merci de votre aide.
Stéphane
J'ai le script perl essai.pl suivant:
print "++ system ++";
system @ARGV;
print "++ exec ++";
exec @ARGV;
J'ai le fichier arg.bat suivant:
@echo off
echo 1: %1
echo 2: %2
echo 3: %3
Le résultat de la commande:
C:\Tmp>perl essai.pl arg.bat -p"Mon repertoire" -d
est le suivant:
++ system ++
1: "-pMon repertoire"
2: -d
3:
++ exec ++
C:\Tmp>1: -pMon
2: repertoire
3: -d
Pourquoi les arguments sont-ils correctement interprétés par la
commande system alors que ce n'est pas le cas par exec ?
Merci de votre aide.
Stéphane

Poser une question


"Stéphane Müller"
Ça ne devrait pas être le cas... En tous cas, sur Unix, tout se passe
comme prévu (arg.bat ne reeçoit que deux arguments à chaque fois).
C'est certainement un effet de bord de la manière dont 'exec' est
simulé par Perl sur Windows.
--
Paul Gaborit - Perl en français -
Comme Paul Gaborit l'a deviné, il s'agit d'un problème dû à l'émulation de
exec sous Windows. Les guillemets sont retirés par cmd.exe.
Pour créer un process avec CreateProcess, Perl a besoin d'une ligne de
commande complète (donc une chaîne et pas une liste). Il reconstitue cette
ligne de commande à partir de la liste d'arguments d'exec.
Voir la fonction create_command_line dans win32.c :
http://search.cpan.org/src/NWCLARK/...32/win32.c
C'est cette fonction qui rajoute des guillemets en utilisant un algorithme
heuristique... qui n'est pas parfait (voir les commentaires dans le code).
Vous pouvez "protéger" vos guillemets :
F:tmp>perl essai.pl arg.bat -p"Mon repertoire" -d
++ system ++
1: -p"Mon repertoire"
2: -d
3:
++ exec ++
F:tmp>1: -p"Mon repertoire"
2: -d
3:
--
J-L.M.
http://www.bribes.org/perl
(Jean-Louis MOREL) écrivait (wrote):
Ce qui m'étonne quand même un peu dans cette histoire, c'est que les
deux appels (system et exec) se comportent de manière
différentes... alors qu'ils devraient être quand même très similaires.
Pourquoi l'appel 'system' reconstitue-t-il correctement la ligne de
commande et pas 'exec' ?
--
Paul Gaborit - Perl en français -
fonctionner correctement le exec:
$cmd = shift @ARGV;
while ( $arg = shift @ARGV ) { $cmd .= " "$arg"" }
exec $cmd;
Ce n'est pas génial mais ça a le mérite de fonctionner pour mon
cas.
En tout cas, merçi pour vos réponses.
Stéphane