web-dev-qa-db-fra.com

Comment appeler une commande Shell dans mon script Perl?

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?

46
Yang

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.

67
fire.eagle

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 commande
  • exec "vim ~/foo" - si vous ne voulez pas retourner au script après avoir exécuté la commande
  • open(my $file, '|-', "grep foo"); print $file "foo\nbar" - si vous voulez diriger l'entrée dans la commande
15
sjy

Exemples

  1. `ls -l`;
  2. system("ls -l");
  3. exec("ls -l");
12
user376314

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.

11
Jonathan Leffler

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);
}
8
Grant McLean

Vous pouvez appeler une commande Shell à partir d'un script Perl de nombreuses façons, par exemple:

  1. cochez la case ls qui capture le résultat et vous le rend.
  2. système système ('ls');
  3. ouvrir

Référez-vous au numéro 17 ici: Conseils de programmation Perl

6
thegeek

Vous voudrez peut-être examiner open2 et open au cas où vous auriez besoin d'une communication bidirectionnelle.

1
miedwar