Perl et commandes Linux

Résolu/Fermé
artagon7
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
- 15 déc. 2007 à 19:57
 Christophe7502 - 16 mars 2009 à 11:02
Bonjour,

J'essaie d'ecrire un script Perl tres simple qui consiste :

1) a changer de repertoire;
2) a assigner a une variable le contenu du repertoire en question;
3) a afficher le contenu de la variable.

Mais j'ai de la difficulte avec les commandes Linux. Voici mon script :


Script

#!/usr/bin/perl

$nom_rep = '/media/sda5/Informatique/Test';
chdir ("$nom_rep");
$ou = "$pwd";
print "\nOu? = $ou";
$contenu = 'ls -gG';
print "\n\nLe contenu du repertoire $nom_rep est : \n\n$contenu\n";


Resultat


$ perl perl_test_command_ls.pl

Ou? =

Le contenu du repertoire /media/sda5/Informatique/Test est :

ls -gG


La commande chdir fonctionne car je l'ai teste dans un autre script. Donc, Perl change cd pour chdir???

C'est avec pwd et ls -gG qu'il y a probleme. Pourtant, en ce qui concerne la ligne $contenu = 'ls -gG' (avec les guillemets simples) je l'ai directement copie d'un exemple sur Perl donne sur Internet.

Il semble donc que Perl contrairement a Sed n'integre pas les commandes Linux.

J'ai telecharge le document Perl documentation (2004) mais je n'ai rien trouve parmi les 1714 pages concernant Perl et les commandes Linux. Le probleme est qu'il n'y a pas d'index dans ce document.

Merci,

7 réponses

lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565
15 déc. 2007 à 21:36
Re,

La commande chdir fonctionne car je l'ai teste dans un autre script. Donc, Perl change cd pour chdir???

Tout d'abord il faut faire la différence entre les fonctions internes du Perl et les commandes du GNU/Linux
chdir c'est une fonction qui permet de changer le répertoire dans le script, par défaut le script travaille dans le répertoire courant

C'est avec pwd et ls -gG qu'il y a probleme. Pourtant, en ce qui concerne la ligne $contenu = 'ls -gG' (avec les guillemets simples) je l'ai directement copie d'un exemple sur Perl donne sur Internet.

Perl peut exécuter une commande système de 2 façon :

1.
La fonction system

Cette fonction exécute une commande système et renvoie son code du rétour mais pas sa sortie

2.

L'opérateur qx// ou les guillemets inverses ``

qx// et `` permettent de récuperer la sortie d'une commande système

Il semble donc que Perl contrairement a Sed n'integre pas les commandes Linux.


sed est un streaming editor qui permet de traiter un fichier ligne par ligne, mais il n'intégre pas les commandes système, il les utilises tout simplement

J'ai telecharge le document Perl documentation (2004) mais je n'ai rien trouve parmi les 1714 pages concernant Perl et les commandes Linux. Le probleme est qu'il n'y a pas d'index dans ce document.

Peut être que tu n'as pas bien chercher ;-)


1) a changer de repertoire;
2) a assigner a une variable le contenu du repertoire en question;
3) a afficher le contenu de la variable.

Mais j'ai de la difficulte avec les commandes Linux.



Tu n'as pas besoin de changer le répertoire de travail. Tu dois faire tout simplement
#!/usr/bin/perl
use strict;use warnings;

my $rep = "/home/lami20j/trash2";
my @ls = qx{ls -gG $rep};

print @ls;

4
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565
15 déc. 2007 à 19:59
Salut,

je vais t'expliquer ça dans un instant ;-)
en revanche, la prochaine fois poste plutôt sur le Forum Programmation ;-)
0
artagon7
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
15 déc. 2007 à 20:30
Salut Lami20j,

Oui je me suis apercu apres l'avoir envoye que j'etais dans le mauvais forum!
0
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565
15 déc. 2007 à 21:43
Pour mieux comprendre
#!/usr/bin/perl
use strict;use warnings;

# répertoire courant /home/lami20j
# répertoire de travail /home/lami20j/trash2
#
#
# répertoire que je vais lister
my $rep = "/home/lami20j/trash2";

# je suis dans le répertoire courant
print "$ENV{PWD}\n";

# je change de répertoire (à l'interieur de script)
# pour réaliser le listing
chdir $rep;
# je capture la liste de fichiers
my @ls = qx{ls -gG $rep};
# je l'affiche
print "@ls\n";
# mais je suis toujours dans le répertoire courant
print "$ENV{PWD}\n";
__END__
l'exécution
lami20j@debian:~$ pwd
/home/lami20j
lami20j@debian:~$ perl /home/lami20j/trash/artagon.pl
/home/lami20j
total 22100
 -rw-r--r-- 1        0 2007-11-24 18:35 abc
 -rwxr-xr-x 1        0 2007-11-24 18:35 a.c
 drwxr-xr-x 7     4096 2007-11-29 23:37 archive_iso
 -rwxr-xr-x 1        0 2007-11-24 18:35 b.c
 drwxr-xr-x 9     4096 2007-12-03 21:57 cgi-bin
 drwxr-xr-x 2     4096 2007-12-09 16:43 exxan
 -rw-r--r-- 1    26013 2007-11-27 20:47 jeff_astuce_192.168.0.1.odp
 -rw-r--r-- 1     4152 2007-11-27 20:56 jeff.original
 -rw-r--r-- 1    68509 2007-11-27 20:45 lan1.png
 -rw-r--r-- 1    66596 2007-11-27 20:46 lan2.png
 -rw-r--r-- 1    67955 2007-11-27 20:47 lan3.png
 -rw-r--r-- 1        0 2007-11-24 18:35 nom.prenom.txt
 -rw-r--r-- 1        0 2007-12-01 23:44 Op4564646574
 drwxr-xr-x 4     4096 2004-08-01 14:26 openquartz
 -rw-r--r-- 1 22323200 2004-08-01 14:53 OpenQuartzLinux2004.08.01.tar
 -rw-r--r-- 1        0 2007-12-01 23:44 Opjsdlfjsdlkjf
 drwxr-xr-x 2     4096 2007-12-08 23:39 wmv

/home/lami20j
lami20j@debian:~$ pwd
/home/lami20j
lami20j@debian:~$

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
artagon7
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
15 déc. 2007 à 22:38
J'ai essaye ton petit script lami20j et ca fonctionne.

Je viens d'effectuer une recherche pour trouver le mot "qx" dans le document Perl documentation et j'ai effectivement trouve des "traces" de qx mais on dirait que les auteurs ne mettent pas trop d'emphase sur ca (la premiere mention est faite a la page 234!! Pourtant, ce n'est pas un point negligeable.

Peut-etre que ce document (ou plutot bible -> 1714 pages) s'adresse avant tout a des gens qui connaisssent bien Perl et non a des debutants.

Merci beaucoup,
0
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 565
15 déc. 2007 à 22:53
Regarde ici Opérateurs d'expression rationnelle
voir la partie avec
qx/CHAINE/
`CHAINE`
comme je te l'ai dit Peut être que tu n'as pas bien chercher ;-) ;-))
0
Christophe7502
16 mars 2009 à 11:02
Bonjour,

dsl de réactiver un vieu sujet mais j'ai moi aussi des problème avec les commandes linux dans perl.
En fait j'ai surtout un problème quand j'utilise une * dans les commande. Par exemple :

ls /etc/lighttpd/*.tar.gz cette commande dans un script shell marche très bien mais quand je la passe sous perl :
$del=`ls /etc/lighttpd/*.tar.gz`; j'ai l'erreur suivante : ls: /etc/lighttpd/*.tar.gz: No such file or directory
même chose avec $del = qx(ls /etc/lighttpd/*.tar.gz);
Quelqu'un pourrais m'aider?

Merci d'avance.
0
artagon7
Messages postés
373
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
31 mars 2021
7
15 déc. 2007 à 23:22
Merci pour la reference lami20j. Je l'ai mise dans mes liens favoris.
0