OVH Cloud OVH Cloud

erreur de test

7 réponses
Avatar
nicolas
J'ai des tests qui foirent :

if ( $opt_dlmkrc == 1 )
{
if ( ! -e $ENV{HOME}/.monprog/ ) << ligne 228
{
mkdir $ENV{HOME}/.monprog/;
print ".monprog/ $DLTXTISCREATED";
} << ligne 232
if ( ! -e $ENV{HOME}/.monprog/monprog.rc ) {
system("cp /etc/monprog/monprog.rc $ENV{HOME}/.monprog/");
print ".monprog/monprog.rc $DLTXTISCREATED";
}
if ( ! -e $ENV{HOME}/.monprog/playlist.rc ) {
system("cp /etc/monprog/playlist.rc \
$ENV{HOME}/.monprog/");
print ".monprog/playlist.rc \
$DLTXTISCREATED";
}
exit;
}

nicolas@monime:bin> bin/monprog.pl --dlmkrc
syntax error at bin/monprog.pl line 228, near "/."
syntax error at bin/monprog.pl line 232, near "}"
Execution of bin/monprog.pl aborted due to compilation errors.

Bon, je n'ai pas testé si le fichier ~/.monprog/ existait et était un
répertoire, mais ça foire. Il faut que je rajoute des parenthèses
quelquepart ?

De plus, je n'ai pas trouvé de commande perl pour copier un fichier comme
on crée un répertoire alors j'ai utilisé system...

nicolas patrois : pts noir asocial
--
PEACE

M : La guerre, ça amène la mort, les épidémie, la vermine... la souffrance, la destruction, la peur...
P : ...Et les pacifistes !

7 réponses

Avatar
oups
nicolas wrote:
J'ai des tests qui foirent :

if ( $opt_dlmkrc == 1 )
{
if ( ! -e $ENV{HOME}/.monprog/ ) << ligne 228
{
mkdir $ENV{HOME}/.monprog/;
print ".monprog/ $DLTXTISCREATED";
} << ligne 232
if ( ! -e $ENV{HOME}/.monprog/monprog.rc ) {
system("cp /etc/monprog/monprog.rc $ENV{HOME}/.monprog/");
print ".monprog/monprog.rc $DLTXTISCREATED";
}
if ( ! -e $ENV{HOME}/.monprog/playlist.rc ) {
system("cp /etc/monprog/playlist.rc
$ENV{HOME}/.monprog/");
print ".monprog/playlist.rc
$DLTXTISCREATED";
}
exit;
}

:bin> bin/monprog.pl --dlmkrc
syntax error at bin/monprog.pl line 228, near "/."
syntax error at bin/monprog.pl line 232, near "}"
Execution of bin/monprog.pl aborted due to compilation errors.

Bon, je n'ai pas testé si le fichier ~/.monprog/ existait et était un
répertoire, mais ça foire. Il faut que je rajoute des parenthèses
quelquepart ?

De plus, je n'ai pas trouvé de commande perl pour copier un fichier comme
on crée un répertoire alors j'ai utilisé system...

nicolas patrois : pts noir asocial


hum, salut,

manquerais pas des "" qqpart ? ;) comme :
if ( ! -e "$ENV{HOME}/.monprog/" ) << ligne 228

Cordialement,

--
oups

my mail: http://oupsinet.free.fr/mail.html

Avatar
Rue des Prairies
nicolas wrote:

J'ai des tests qui foirent :

if ( $opt_dlmkrc == 1 )
{
if ( ! -e $ENV{HOME}/.monprog/ ) << ligne 228


unless (-e $ENV{HOME} . '/.monprog') {

{
mkdir $ENV{HOME}/.monprog/;


mkdir $ENV{HOME} . '/.monprog';

print ".monprog/ $DLTXTISCREATED";
} << ligne 232
if ( ! -e $ENV{HOME}/.monprog/monprog.rc ) {
system("cp /etc/monprog/monprog.rc $ENV{HOME}/.monprog/");
print ".monprog/monprog.rc $DLTXTISCREATED";
}
if ( ! -e $ENV{HOME}/.monprog/playlist.rc ) {
system("cp /etc/monprog/playlist.rc
$ENV{HOME}/.monprog/");
print ".monprog/playlist.rc
$DLTXTISCREATED";
}
exit;
}

:bin> bin/monprog.pl --dlmkrc
syntax error at bin/monprog.pl line 228, near "/."
syntax error at bin/monprog.pl line 232, near "}"
Execution of bin/monprog.pl aborted due to compilation errors.

Bon, je n'ai pas testé si le fichier ~/.monprog/ existait et était un
répertoire, mais ça foire. Il faut que je rajoute des parenthèses
quelquepart ?

De plus, je n'ai pas trouvé de commande perl pour copier un fichier comme
on crée un répertoire alors j'ai utilisé system...

nicolas patrois : pts noir asocial


Utilise le module File::Copy

Olivier.

Avatar
Jérémy JUST
On Sun, 21 Sep 2003 15:08:28 +0200
nicolas wrote:

Avant toute chose:

if ( ! -e $ENV{HOME}/.monprog/ )
if ( ! -e "$ENV{HOME}/.monprog" )



mkdir $ENV{HOME}/.monprog/;
mkdir "$ENV{HOME}/.monprog" ;


Etc.

Il faut que je rajoute des parenthèses quelque part ?


Des guillemets doubles.
C'est ce que je vois au premier abord. Je ne te garantis pas que ton
programme marchera en ne corrigeant que ça.


De plus, je n'ai pas trouvé de commande perl pour copier un fichier
comme on crée un répertoire alors j'ai utilisé system...


Les commande Perl, c'est open(, "<"), open(, ">") et print. C'est
exactement ce que fait cp en C (je te conseille d'aller lire les sources
de cp pour t'en rendre compte).
Mais il est généralement plus simple d'appeler directement cp, sous
réserve de bien tout sécuriser.

Happy perling.

--
Jérémy JUST

Avatar
nicolas
On Sun, 21 Sep 2003 16:24:56 +0200, Jérémy JUST wrote:

Il faut que je rajoute des parenthèses quelque part ?


Des guillemets doubles.


Voui, ça marche. Merci à tous.

C'est ce que je vois au premier abord. Je ne te garantis pas que ton
programme marchera en ne corrigeant que ça.

Les commande Perl, c'est open(, "<"), open(, ">") et print. C'est
exactement ce que fait cp en C (je te conseille d'aller lire les sources
de cp pour t'en rendre compte).
Mais il est généralement plus simple d'appeler directement cp, sous
réserve de bien tout sécuriser.


J'ai utilisé system("cp monfichier $ENV{HOME}/.monprog/monprog.rc"); mais
je ne sais pas sécuriser. Enfin, pas grave, vu que le programme est pour
mon usage perso et qu'il n'est pas setuid root.

nicolas patrois : pts noir asocial

--
PEACE

M : La guerre, ça amène la mort, les épidémie, la vermine... la souffrance, la destruction, la peur...
P : ...Et les pacifistes !


Avatar
Jérémy JUST
On Sun, 21 Sep 2003 18:31:51 +0200
nicolas wrote:

Mais il est généralement plus simple d'appeler directement cp, sous
réserve de bien tout sécuriser.


J'ai utilisé system("cp monfichier $ENV{HOME}/.monprog/monprog.rc");
mais je ne sais pas sécuriser. Enfin, pas grave, vu que le programme
est pour mon usage perso et qu'il n'est pas setuid root.


Bon, donc si le programme tourne sous ton nom, aucun risque qu'il
puisse faire plus de mal que tu ne pourrais en faire avec cp ou rm.

Par contre, n'oublie pas de vérifier que ton cp a marché comme prévu.
Pour ça, récupère la valeur de retour de system(), qui est en fait le
code de sortie de cp, et vérifie qu'il vaut 0 (= pas d'erreur).

Typiquement:
system("cp orig dest") or die "Je n'arrive pas à copier.n" ;

Et je te conseille de préciser que tu veux utiliser /bin/cp, ça
t'évitera de te heurter aux alias définis dans certains distributions
bien intentionnées (alias cp='cp -i').

--
Jérémy JUST


Avatar
root
On Sun, 21 Sep 2003 19:49:32 +0200, Jérémy JUST wrote:

On Sun, 21 Sep 2003 18:31:51 +0200
nicolas wrote:

Mais il est généralement plus simple d'appeler directement cp, sous
réserve de bien tout sécuriser.


J'ai utilisé system("cp monfichier $ENV{HOME}/.monprog/monprog.rc");
mais je ne sais pas sécuriser. Enfin, pas grave, vu que le programme
est pour mon usage perso et qu'il n'est pas setuid root.


Bon, donc si le programme tourne sous ton nom, aucun risque qu'il
puisse faire plus de mal que tu ne pourrais en faire avec cp ou rm.

Par contre, n'oublie pas de vérifier que ton cp a marché comme prévu.
Pour ça, récupère la valeur de retour de system(), qui est en fait le
code de sortie de cp, et vérifie qu'il vaut 0 (= pas d'erreur).

Typiquement:
system("cp orig dest") or die "Je n'arrive pas à copier.n" ;



Trois remarques :

- Comme dit plus haut, pour faire une copie de fichier il vaut mieux
utiliser le module `File::Copy' (taper `perldoc File::Copy' pour plus
d'informations) qui fourni une fonction copy() et move() indépendante du
système d'exploitation.

- Pour l'utilisation de la fonction `system()', il vaut mieux prendre de
bonne habitudes et utiliser la forme à plusieurs arguments :

system( '/usr/bin/monprogramme', '-option1', 'valeur1', $fic1, $fic2 );

Cette forme est plus «sûre» et permet d'éviter des problèmes avec des noms
de fichiers fournis contenant du code shell, par exemple dans le cas ou la
variable `$fic1' ou `$fic1' vaudrait "; rm -Rf /"

- Encore au sujet de la fonction `system()', ton `system() or die' ne
foncionne pas correctement. Un exemple, si je lance :

$ perl -e 'system("ls /root") or die "Erreur !n"; print "Tout va bien ...n"'
ls: /root: Permission denied
Tout va bien ...
$

L'erreur du `ls' n'est pas detecté, et le programme continue son
déroulement normal.
La notation correcte est la suivante :

system() == 0 or die "Erreur";

$ perl -e 'system("ls /root") == 0 or die "Erreur !n"; print "Tout va bien ...n"'
ls: /root: Permission denied
Erreur !
$

Là, l'erreur est bien detecté.

Taper `perldoc -f system' pour plus de détails sur l'utilisation de la
fonction system()

Pour résumer donc :
- copie de fichier avec le module `File::Copy'
- passage des arguments de system() avec une liste :
system(@ARGS);
- detection des erreurs d'un appel system() avec :
system(@ARGS) == 0 or die;



Avatar
Jérémy JUST
On Sun, 21 Sep 2003 23:43:34 +0200
root wrote:

- Pour l'utilisation de la fonction `system()', il vaut mieux prendre
de bonne habitudes et utiliser la forme à plusieurs arguments


Certes. Mais dans le cas de Nicolas, ce n'est qu'une bonne habitude
pour d'autres situations. C'est en pensant à ça que je lui ai dit:
« si le programme tourne sous ton nom, aucun risque qu'il puisse faire
plus de mal que tu ne pourrais en faire avec cp ou rm. »


Cette forme est plus «sûre»


Et plus économique en temps d'exécution (je n'ai pas testé, mais ça
semblerait naturel).


La notation correcte est la suivante :

system() == 0 or die "Erreur";


Oui. Pardon!
J'avais écrit ça par habitude pour la plupart des fonctions; mais il
faut penser qu'un programme qui a fonctionné correctement renvoie 0,
donc "faux", contrairement à l'intuition.
Dans mon code, il fallait remplacer "or" par "and"; mais la notation
"== 0" est plus lisible dans ce cas-ci.

Désolé pour cette bêtise.

--
Jérémy JUST