Les Allergies
Alimentaires
Posez votre question Signaler

Perl et commandes Linux [Résolu]

artagon7 165Messages postés 6 novembre 2005Date d'inscription 17 mai 2012Dernière intervention - Dernière réponse le 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,
Lire la suite 

Perl et commandes Linux »

8 réponses
Réponse
+2
moins plus
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;

Ajouter un commentaire
Réponse
+0
moins plus
Salut,

je vais t'expliquer ça dans un instant ;-)
en revanche, la prochaine fois poste plutôt sur le Forum Programmation ;-)
Ajouter un commentaire
Réponse
+0
moins plus
Salut Lami20j,

Oui je me suis apercu apres l'avoir envoye que j'etais dans le mauvais forum!
Ajouter un commentaire
Réponse
+0
moins plus
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:~$

Ajouter un commentaire
Réponse
+0
moins plus
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,
Ajouter un commentaire
Réponse
+0
moins plus
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 ;-) ;-))
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.
Ajouter un commentaire
Réponse
+0
moins plus
Merci pour la reference lami20j. Je l'ai mise dans mes liens favoris.
Ajouter un commentaire
Ce document intitulé « Perl et commandes Linux » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?