Quel serait un exemple de la façon dont je peux appeler une commande Shell en disant 'ls -a
'dans un script Perl et le moyen de récupérer le résultat de la commande également?
Comment exécuter un script shell depuis un programme Perl
1. Using system system ($ command, @arguments);
Par exemple:
system("sh", "script.sh", "--help" );
system("sh script.sh --help");
Le système exécutera la commande $ avec @arguments et reviendra dans votre script lorsque vous aurez terminé. Vous pouvez vérifier $! pour certaines erreurs transmises au système d'exploitation par l'application externe. Lisez la documentation du système pour connaître les différences entre les différentes invocations.
2. Utiliser exec
Ceci est très similaire à l'utilisation de system , mais il mettra fin à votre script lors de son exécution. Encore une fois, lisez la documentation de exec pour plus d'informations.
3. Utiliser des backticks ou qx //
my $output = `script.sh --option`;
my $output = qx/script.sh --option/;
L'opérateur backtick et son équivalent qx // exécutent la commande et les options à l'intérieur de l'opérateur et renvoient cette commande à STDOUT à la fin de l'opération.
Il existe également des moyens d'exécuter des applications externes grâce à une utilisation créative de open , mais il s'agit d'une utilisation avancée; lisez la documentation pour plus.
Depuis Perl HowTo , les moyens les plus courants d'exécuter des commandes externes à partir de Perl sont les suivants:
my $files = `ls -la`
- capture le résultat de la commande dans $files
system "touch ~/foo"
- si vous ne voulez pas capturer la sortie de la commandeexec "vim ~/foo"
- si vous ne voulez pas retourner au script après avoir exécuté la commandeopen(my $file, '|-', "grep foo"); print $file "foo\nbar"
- si vous voulez diriger l'entrée dans la commande`ls -l`;
system("ls -l");
exec("ls -l");
Regardez la fonction open dans Perl - en particulier les variantes utilisant un '|' (pipe) dans les arguments. Fait correctement, vous obtiendrez un descripteur de fichier que vous pourrez utiliser pour lire le résultat de la commande. Les opérateurs de tick arrière effectuent également cette opération.
Vous pouvez également vouloir vérifier si Perl a accès aux fonctions C que la commande utilise elle-même. Par exemple, pour ls -a
, vous pouvez utiliser la fonction opendir , puis lire les noms de fichier avec la fonction readdir et enfin fermer le répertoire avec (surprise) le closedir fonction. Cela présente de nombreux avantages - la précision étant probablement plus importante que la vitesse. En utilisant ces fonctions, vous pouvez obtenir les données correctes même si les noms de fichiers contiennent des caractères impairs, tels que newline.
Au fur et à mesure que vous maîtriserez mieux l'utilisation de Perl, vous vous rendrez compte qu'il est de moins en moins nécessaire d'exécuter des commandes Shell. Par exemple, un moyen d'obtenir une liste de fichiers consiste à utiliser la fonction glob intégrée de Perl. Si vous voulez que la liste soit triée, vous pouvez la combiner avec la fonction intégrée sort . Si vous voulez des détails sur chaque fichier, vous pouvez utiliser la fonction stat . Voici un exemple:
#!/usr/bin/Perl
use strict;
use warnings;
foreach my $file ( sort glob('/home/grant/*') ) {
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
= stat($file);
printf("%-40s %8u bytes\n", $file, $size);
}
Vous pouvez appeler une commande Shell à partir d'un script Perl de nombreuses façons, par exemple:
ls
qui capture le résultat et vous le rend.Référez-vous au numéro 17 ici: Conseils de programmation Perl