web-dev-qa-db-fra.com

Comment exécuter un fichier Perl à partir d'un script shell

J'ai une question sur la façon d'exécuter le fichier Perl à l'intérieur d'un script Shell

J'ai 2 fichiers maintenant, "test.sh" et "test.pl", voici des exemples de mes scripts

Script shell

#!/bin/bash
Perl FILEPATH/test.pl
......

Script Perl

#!/usr/bin/Perl
my $a = "hello"
sub saysomething
{
    print $a;
}
.....

La manière dont j'appelle le script Shell est la suivante: sous le chemin des scripts Shell, exécutez "./test.sh"

Tous les mentionnés ci-dessus travaillent dans l’environnement GUN bash, version 4.2.24 (1) - release (i686-pc-linux-gnu) + Perl (v5.14.2)

Mais si je mets ces scripts sur le serveur (je ne pouvais pas changer la version bash/Perl) GNU bash, version 4.2.10 (1) -release (x86_64-pc-linux-gnu) + Perl ( v5.12.4), j'ai reçu le message suivant:

FILEPATH/test.pl: ligne 2: ma: commande non trouvée

Est-ce que quelqu'un sait comment puis-je résoudre ce problème?

En passant, si j'exécute le script Perl individuellement (Perl FILEPATH/FILENAME.pl), cela fonctionne parfaitement.

8
user1672190

Pour exécuter un script Perl avec un script .sh, vous n'avez pas besoin d'utiliser le préfixe Perl, mais uniquement:

#!/bin/sh

/somewhere/perlScript.pl

Cela fonctionnera sans problème.

3
Massimo

"commande introuvable" est une erreur émise par le shell. Vous essayez d'exécuter votre script Perl par le shell, pas par Perl.

1
choroba

Commencez par vérifier où Perl est installé sur votre système, par exemple. which Perl et utilisez cet emplacement dans la ligne Shebang au lieu de /usr/bin/Perl, s'il est différent.

Si toutes les autres recommandations échouent, vérifiez la première ligne du script sur la machine sur laquelle il ne s'exécute pas correctement en procédant comme suit: head -1 test.pl | xxd. La sortie affiche-t-elle les deux derniers octets sous la forme 0d 0a? Si tel est le cas, vous avez probablement copié le fichier via Windows et n'avez pas effectué de conversion dos2unix.

1
imran

Ce problème est au moins double. Premièrement, vous devez avoir l'emplacement de Perl dans votre environnement PATH. Deuxièmement, l'emplacement de Perl peut être différent sur des machines différentes. Une solution aux problèmes que moi-même et d’autres avons utilisés pendant des années consiste à utiliser un "en-tête magique" au sommet des programmes Perl. L'en-tête s'identifie en tant que script shell sh et exploite le fait que/bin/sh existe dans toutes les versions/versions de Linux/UNIX. L'en-tête consiste à fortifier le PATH avec divers emplacements Perl possibles, puis à exécuter le script Perl à la place de lui-même (via exec). Voici un exemple "Hello World":

1  #! /bin/sh --
2  eval '(exit $?0)' && eval 'Perl_BADLANG=x;PATH="/usr/bin:/bin:/usr/local/bin:$PATH";export Perl_BADLANG;: \
3  ;exec Perl -x -S -- "$0" ${1+"$@"};#'if 0;
4  exec 'setenv Perl_BADLANG x;exec Perl -x -S -- "$0" $argv:q;#'.q
5  #!/bin/Perl -w
6  +($0=~/(.*)/s);do(index($1,"/")<0?"./$1":$1);die$@if$@;__END__+if 0;
7  # Above is magic header ... real Perl code begins here
8  use strict;
9  use warnings;
10 print "hello world!\n";

Remarque: j'ai ajouté des numéros de ligne simplement pour indiquer clairement le début et la fin des lignes.

1
Ken Schumack