Comment utiliser system() de Perl pour afficher les commandes exécutées

Lorsque vous travaillez avec Perl, l’exécution de commandes système peut se faire en utilisant soit la fonction system(), soit les backticks. Bien que cela vous permette d’exécuter des commandes, cela masque généralement les commandes à la vue, ce qui peut être frustrant pendant le développement ou le débogage. Si vous vous êtes déjà retrouvé à vouloir voir les commandes exécutées dans votre script—exactement comme vous le feriez avec la commande @echo on dans un fichier batch Windows—vous êtes au bon endroit ! Explorons comment y parvenir.

Le Problème

La fonction system() de Perl permet l’exécution de commandes système, mais par défaut, elle n’imprime pas la commande exécutée. Cela peut être utile pour les scripts de production où vous souhaitez garder la sortie propre. Cependant, pour le débogage ou une compréhension plus profonde, voir ces commandes en temps réel serait extrêmement bénéfique.

La Solution

Pour résoudre ce problème, nous pouvons créer un simple wrapper autour de la fonction system() qui imprimera la commande avant son exécution. De cette manière, vous aurez une visibilité complète sur les commandes traitées par votre script Perl. Voici les étapes pour mettre cela en œuvre :

Étape 1 : Comprendre system()

La fonction system() peut exécuter une commande et retourner son statut de sortie, mais elle n’affiche pas la commande elle-même. Voici un exemple basique :

$ls = system("ls");
print "Résultat : $ls\n";  # Cela n'affichera pas la commande 'ls'

La sortie montrera uniquement le résultat, pas la commande qui a été exécutée.

Étape 2 : Imprimer les Commandes avec une Fonction Wrapper

Pour imprimer la commande ainsi que sa sortie, nous pouvons créer une sous-routine qui prend une commande comme argument, l’imprime sur le terminal, puis exécute la commande elle-même. Voici comment vous pouvez le faire :

sub execute {
    my $cmd = shift;          # Obtenir la commande
    print "$cmd\n";          # Imprimer la commande exécutée
    system($cmd);            # Exécuter la commande
}

my $cmd = $ARGV[0];          # Obtenir la commande depuis l'argument de la ligne de commande
execute($cmd);               # Appeler la fonction avec la commande

Étape 3 : Exemple d’Utilisation

Pour utiliser cette fonction, il vous suffit d’appeler votre script Perl depuis la ligne de commande tout en passant la commande souhaitée comme argument. Par exemple :

perl votre_script.pl "ls"  # Remplacez "votre_script.pl" par le nom de votre script

Lorsque vous exécuterez cela, vous verrez la commande ls imprimée sur le terminal avant son exécution, vous offrant la visibilité dont vous avez besoin.

Résumé

En créant un simple wrapper autour de la fonction system(), vous pouvez imprimer la commande exécutée ainsi que sa sortie. Cette technique est inestimable pour le débogage ou lorsque vous avez besoin de plus de clarté sur ce que fait votre script. N’oubliez pas :

  • system() : Exécute une commande mais ne l’imprime pas.
  • Fonction Wrapper : Créez une nouvelle fonction pour afficher la commande avant de l’exécuter.

Avec cette approche simple, vous pouvez ajouter de la transparence à vos scripts Perl, les rendant plus faciles à surveiller et à déboguer. Bon codage !