2010-08-10 10 views
2

J'essaie de modifier un script Perl pour commenter toutes les lignes correspondant à un motif. Dans l'invite de commande normale, voici la ligne que je suis en train d'ajouter:La commande système Perl n'agit pas comme une invite normale

grep -lIRZ --exclude="*\.svn*" "pattern" . | xargs -0 -l sed -i -e 's/.*pattern.*/\/\/&/g' 

Ici, il est dans le contexte du script perl:

my $rmcmd = "grep -lIRZ --exclude=\"*\\.svn*\" \"pattern\" . | xargs -0 -l sed -i -e 's/.*pattern.*/\\/\\/&/g'"; 
runcmd($rmcmd); 
... 
sub runcmd { 
    my @cmd = @_; 
    print "Running: @cmd\n"; 
    system(@cmd); 
    # Get status from system 
    my $ret = $? >> 8; 

    if ($ret) { 
     print "-E- command completed with error code $ret.\n"; 
     exit(1); 
    } 
    return ($ret); 
} 

Tout fonctionne correctement lorsqu'il est exécuté à partir d'une invite de commande , mais le script exécutant la même commande se bloque toujours. Qu'est-ce qui est fait différemment et comment puis-je le réparer?

+3

(1) S'il vous plaît signaler l'erreur exacte que vous obtenez. (2) Veuillez imprimer et afficher la valeur de '$ rmcmd' - idéalement, à la fois via' print' et le débogueur Perl. (3) La bonne solution est de réécrire tout ce tuyau compliqué en code Perl. – DVK

+0

(1) L'erreur exacte est: -E- commande terminée avec le code d'erreur 1.
(2) La fonction d'impression retourne: grep -lIRZ --exclude = "* \. Svn *" "dlclose". | xargs -0 -l sed -i -e /.* dlclose. */\/\/& g '
(3) Je suis nouveau à perl et runcmd était déjà défini dans le script. Quelle est la bonne façon de canaliser le code Perl? Pouvez-vous me donner quelques références? – user108088

+1

pourquoi ne faites-vous pas tout cela en Perl? vous rendez votre code non portable. – ghostdog74

Répondre

0

Votre code fonctionne pour moi - avec Perl 5.10.1 sur Ubuntu - après avoir réinséré le point-virgule manquant à la fin de la ligne $ rmcmd = ...

+0

Fonctionne pour moi aussi sur Ubuntu. – szbalint