Salut,
J'ai un script qui gère mal les arguments dans @ARGV, car il sépare en plusieurs arguments lorsqu'il y a un espace dans un argument, alors que ce dernier est pourtant mis entre ""
quelqu'un saurait-il comment régler ce léger problème ?
![]()
Salut,
J'ai un script qui gère mal les arguments dans @ARGV, car il sépare en plusieurs arguments lorsqu'il y a un espace dans un argument, alors que ce dernier est pourtant mis entre ""
quelqu'un saurait-il comment régler ce léger problème ?
![]()
La réponse dépend du script. C'est le shell qui se charge de mettre les bons arguments dans @ARGV, donc tu ne peux rien faire si le dysfonctionnement est du côté du shell (ou plutôt du côté de la personne qui a mal rédigé les arguments du script). Cependant tu sembles dire que le script lui-même redécoupe les arguments qui lui sont donnés ? Dans ce cas il suffit de modifier le script pour qu'il ne fasse plus cela. A moins qu'il y ait une réelle raison pour ce comportement ?
--
Jedaï
Sinon, comment récupères-tu les données rangées dans @ARGV ?
Peut-on voir un bout de ton code ?
je récupère les arguments contenus dans @ARGV avec
car le nombre d'arguments n'est pas connu à l'avance...
Code : Sélectionner tout - Visualiser dans une fenêtre à part my $var = shift @ARGV;
pour ce qui est de l'appel du script via le shell, je lance :
Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ./mon_script.pl "[ejfdjhgdf]courant d'air" courant_d-air
Dans ce cas le problème n'est pas dans le parsing des arguments, mais plutôt dans leur utilisation... Un exemple courant :
Si tu appelles ce script avec comme paramètre "hello world", $var contiendra hello world (sans les guillemets), d'où plantage quand tu utilises system avec une commande qui n'attend qu'un seul argument...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 my $var = shift; system "command $var";
La solution dans ce cas est :
(D'une manière générale, il vaut toujours mieux utiliser la version à plusieurs arguments de system() ou exec(), sauf si on a explicitement besoin que la ligne de commande soit interprétée par un shell)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 my $var = shift; system 'command', $var;
Evidemment il y a d'autres endroits où cela peut poser problème, sans ton script, nous ne pouvons pas t'en dire plus.
--
Jedaï
non je n'utilise pas system ensuite... je fais juste un echo pour le moment
en gros, c'est un script pour renommer des fichiers...
donc je lis le premier nom de fichier, le nouveau nom, et j'utilise rename... avec tous les tests qui vont bien.
or a cause de l'espace, ça passe pas![]()
Ce n'est pas à cause de l'espace que ça ne passe pas, rename s'en contrefout... Néanmoins il peut y avoir d'autres obstacle à rename, par exemple si tu changes de fs, ça ne marche pas. C'est pourquoi je recommanderai plutôt d'utiliser le move() de File::Copy, rename() est une fonction de bas niveau (directement un appel système en fait), File::Copy est livré en standard avec Perl depuis Perl 5.2, donc aucun problème de portabilité !Envoyé par gorgonite
Si ça ne marche toujours pas, tu pourrais peut-être nous montrer ton code finalement ? Je sais que c'est top secret, mais de ce que tu nous dis ça n'a pas l'air si critique que ça ...![]()
--
Jedaï
ben je lance cette commande :
Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 www-data@GorgonMobile:/home/gorgonite$ ssh gorgonite@localhost \ /home/gorgonite/ensta/clubinfo/admin.pl \[eyfjghdjhg34TY\]fichier\ super\ d?air fichier-air fichier [eyfjghdjhg34TY]fichier Le fichier [eyfjghdjhg34TY]fichier n'existe pas
voici mon script
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 #! /usr/bin/perl # vim:set ts=4 sw=4 : use strict; use warnings; sub usage() { exit; } sub problem($) { my $msg = shift @_; print "$msg\n"; exit(-1); } $ARGV[0] or usage(); my $tempDir = "/home/gorgonite/temp"; my $ftpDir = "/home/gorgonite/temp/temp_ftp"; chdir($tempDir); while (my $file = shift @ARGV) { if ($file =~ m/\.\./) { problem("fichier $file incorrect"); } print "fichier $file\n"; if (my $newName = shift @ARGV) { if ($file =~ m/\.\./) { problem("fichier $newName incorrect"); } if (-e $file) { chmod(0664,$file); my $newFile = "$ftpDir/$newName"; if (-e $newFile) { problem("Le fichier $newFile existe déjà"); } else { print "$file\t->\t$newFile\n"; rename($file,$newFile); } } else { problem("Le fichier $file n'existe pas"); } } else { problem("Il manque le nouveau nom de fichier pour $file"); } }
Après test, j'ai confirmation de mon idée :
Ton problème n'est pas Perl, mais ssh... Si tu utilises exactement la même ligne en local, ça marchera comme une fleur. Avec ssh tu as droit à une double interprétation des arguments, tu dois donc écrire :
Ou un truc comme ça !
Code : Sélectionner tout - Visualiser dans une fenêtre à part ssh gorgonite@localhost \ /home/gorgonite/ensta/clubinfo/admin.pl \\\[eyfjghdjhg34TY\\\]fichier\\\ super\\\ d\?air fichier-air![]()
--
Jedaï
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager