2010-04-09 16 views
6

J'ai écrit un script Perl, je veux juste le donner à tout le monde, pour ce que j'ai prévu d'écrire un script bash qui est utilisé pour tester l'environnement d'un utilisateur et trouver si cet environnement est capable d'exécuter le Perl scénario.Comment vérifier la disponibilité de Perl, sa version et la présence d'un module requis?

Je veux tester les choses comme:

  1. Que Perl a installé dans ce système
  2. Perl doit avoir la version 5 ou plus
  3. Que le module JSON :: Tout est disponible

Toute suggestion serait grandement appréciée :-)

Répondre

2
if perl -MJSON::Any -e 'print "$JSON::Any::VERSION\n"' >/dev/null 2>&1 
then : OK 
else echo "Cannot find a perl with JSON::Any installed" 1>&2 
    exit 1 
fi 

J'utilise souvent '${PERL:-perl}' et constructions similaires pour identifier la commande (par awk vs nawk ou gawk; troff vs groff; etc).

Si vous voulez tester la version de JSON :: Any, capturez plutôt la sortie de la commande. Si vous voulez tester la version de Perl, ajoutez 'use 5.008009;' ou n'importe quel nombre que vous pensez raisonnable. (Il n'y a pas si longtemps, ils ont finalement retiré Perl 4 de l'un des systèmes de fichiers montés sur NFS au travail - mais ce n'était pas le seul Perl sur la machine - au moins pas dans la dernière décennie!)

+0

Je préférerais 'perl -MJSON :: Any -e1 2>/dev/null' - est-il utile d'imprimer la version et de l'envoyer dans un seau bit – justintime

+0

@justintime: Comme je l'ai dit, si vous voulez vérifier la version de JSON :: Any, capturer la sortie - cela m'a évité d'avoir à expliquer comment obtenir la version comme un exercice séparé. –

8

En ce qui concerne la vérification Perl availab La manière la plus simple de le faire est de vérifier le code retour (code de sortie) de la commande perl -v, si ce n'est pas 0, vous n'avez pas Perl.

Maintenant en ce qui concerne les exigences Perl, vous devriez traiter avec eux à l'intérieur de votre script Perl:

#!/usr/bin/env perl 
use 5.006_001; 
use ModuleName 2.0; 

Le code ci-dessus Perl fonctionnera uniquement avec Perl 5.6.1 ou plus récent et modèle "ModuleName version" 2.0 ou plus récent. Il n'est pas nécessaire de vérifier manuellement la version de Perl à partir de bash, il est préférable et plus facile de le faire directement à partir du script Perl.

Références:

+0

Je ne veux pas imprimer plus de détails, je Je veux juste savoir le numéro de version seulement, quand j'émets la commande perl -v, des suggestions – abubacker

+0

Vous vérifiez le numéro de version dans Perl lui-même avec 'use 5.006_001'. perl -v vérifie juste si un binaire perl peut être exécuté (=> Vérifiez si perl est installé), vous pouvez ignorer tout ce qu'il imprime, juste la valeur de retour de l'exécution est importante. – dbemerlin

+0

La question demande "Est-ce que perl est installé sur le système". Votre réponse exclut l'automatisation de la réponse "perl not found" (perl manquant, ou plus probablement pas sur PATH). Certes, chaque système avec lequel je travaille a Perl installé par le système - mais le questionneur s'inquiète à propos de 'est perl là du tout'. –

14

Non, n'écrivez pas un script shell. Perl a déjà une façon parfaite de le faire. La méthode correcte consiste à créer une distribution prête pour CPAN en utilisant la chaîne d'outils normale. Une partie de ceci est expliquée dans perlnewmod, perlmodstyle et perlmodinstall.

Pour un exemple de travail minimum, créer une mise en page de répertoire ainsi:

. 
├── Build.PL 
├── README 
└── script 
    └── abuscript.pl 

Dans le fichier Build.PL, mis:

use 5.000; 
use Module::Build qw(); 
Module::Build->new(
    module_name  => 'abuscript', 
    dist_version  => '1.000', 
    dist_author  => 'abubacker <[email protected]>', 
    dist_abstract  => 'describe what the script does in one sentence', 
    configure_requires => { 
     'perl' => '5.000', 
    }, 
    requires   => { 
     'JSON::Any' => 0, 
    }, 
)->create_build_script; 

Modifier les détails à la suite vos besoins.

Dans le fichier README, mettre des instructions d'installation, par exemple:

To install this module, run the following commands: 

perl Build.PL 
./Build install 

Une fois que vous avez terminé avec tout cela, vous exécutez:

perl Build.PL 
./Build manifest 
./Build dist 

Cela se traduira par une .tar.gz archives que vous allez distribuer. Dites à vos utilisateurs de l'installer comme n'importe quel autre module CPAN, ou s'ils ne savent pas ce que cela signifie, ils devraient lire le fichier README.

Si vous avez le temps, je vous recommande de convertir votre script en module. Le programme pl2pm (livré avec Perl) et le module CPAN Module-Starter-PBP vous aident.

Si la licence le permet, il est possible de télécharger votre code sur CPAN pour le rendre encore plus pratique pour vos utilisateurs. Demander de l'aide dans l'un des endroits suivants d'abord: liste de diffusion [email protected], forum web PerlMonks, canal IRC#toolchain sur MagNET (irc: //irc.perl.org/toolchain)

+0

Selon la norme CPAN, si j'ai mes propres fichiers .pm où dois-je les ajouter, à la fois dans Build.PL et dans la structure des fichiers? et aussi si j'ai plus d'un script Perl, disons 'script1.pl' et 'script2.pl', comment puis-je l'ajouter dans Build.PL? nom_module => 'script1.pl, script2.pl' ,? Je n'ai pas trouvé d'exemple à ce sujet. –

+0

Exemple: si vous avez un module principal avec la déclaration du paquet 'Fus :: Roh :: Da', renommez-le' Da.pm' et déplacez-le dans 'lib/Fus/Roh/Da.pm'. Dans 'Build.PL', spécifiez [' module_name => 'Fus :: Roh :: Da''] (http://p3rl.org/Module::Build::API#module_name). Placez simplement vos deux scripts dans le sous-répertoire 'script', le reste fonctionne automatiquement au moment de l'installation. - Vous pouvez tester votre fichier Build en exécutant 'perl Build.PL --install_base/tmp; ./Build install' et vérifie le résultat dans le répertoire '/ tmp'. Exécutez './Build distclean' et supprimez manuellement les fichiers installés pour recommencer. – daxim

+0

OK, j'ai fait ce que tu as dit. Où est mon script maintenant? Je m'attendais à le copier quelque part dans/usr/bin, à changer le nom de script.pl en script et à ajouter des droits exécutables.Ce que j'obtiens est un répertoire vide '/ usr/lib/perl5/site_perl/auto/TerminalHero'. BTW, Build pourrait doucement poser des questions sur le mot de passe root au lieu de crier '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ERREUR: Impossible de créer '/ usr/lib/perl5/site_perl/auto/TerminalHero' N'avez pas les droits d'écriture sur '/ usr/lib/perl5/site_perl/auto/TerminalHero' !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ' – ciembor