2010-04-09 7 views
6

Ich habe ein Perl-Skript geschrieben, ich möchte es nur jedem geben, dafür habe ich geplant, ein Bash-Skript zu schreiben, das verwendet wird, um die Umgebung eines Benutzers zu testen und festzustellen, ob diese Umgebung Perl ausführen kann Skript.Wie kann ich die Verfügbarkeit von Perl, seine Version und das Vorhandensein eines benötigten Moduls überprüfen?

Ich möchte wie die Dinge testen:

  1. Ob Perl in diesem System installiert ist
  2. Perl sollte die Version 5 oder mehr haben
  3. Ob das Modul JSON :: Alle verfügbar ist

Jeder Vorschlag würde sehr geschätzt werden :-)

Antwort

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 

I oft '${PERL:-perl}' und ähnliche Konstrukte verwenden, den Befehl (für awk vs nawk oder gawk zu identifizieren; troff vs groff; etc).

Wenn Sie die Version von JSON :: Any testen möchten, erfassen Sie stattdessen die Ausgabe des Befehls. Wenn Sie die Perl-Version testen möchten, fügen Sie 'use 5.008009;' oder eine andere Zahl hinzu, die Sie für sinnvoll halten. (Es ist noch nicht so lange her, dass Perl 4 von einem der NFS-gemounteten Dateisysteme bei der Arbeit entfernt wurde - aber das war nicht das einzige Perl auf der Maschine - zumindest nicht in den letzten zehn Jahren oder mehr!)

+0

Ich würde 'perl -MJSON :: Any -e1 2>/dev/null' bevorzugen - gibt es einen Punkt beim Drucken der Version und Senden an einen kleinen Eimer – justintime

+0

@justintime: Wie ich schon sagte, wenn Sie das überprüfen möchten Version von JSON :: Any, erfassen Sie die Ausgabe - es hat mir erspart, zu erklären, wie man die Version als separate Übung erhält. –

8

Zur Überprüfung Perl zur Verfügung Der einfachste Weg ist, den Rückkehrcode (Exitcode) des Befehls perl -v zu überprüfen. Wenn dies nicht 0 ist, haben Sie kein Perl.

Jetzt Perl Anforderungen an, Sie sollten befassen sich mit ihnen aus Ihrem Perl-Skript:

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

Die obige Perl-Code nur mit Perl 5.6.1 oder neuer und mit modele „Module“ Version läuft 2.0 oder neuer. Es gibt keine Notwendigkeit, die Perl-Version von bash manuell zu überprüfen, es ist besser und einfacher, es direkt aus dem Perl-Skript zu tun.

Referenzen:

+0

) Ich möchte nicht mehr Details drucken, ich will nur die versionsnummer wissen, wenn ich perl -v befehle, irgendwelche Vorschläge – abubacker

+0

Sie überprüfen die Versionsnummer in Perl selbst mit 'verwenden 5.006_001'. perl -v prüft nur, ob eine Perl-Binärdatei ausgeführt werden kann (=> Prüfe, ob Perl installiert ist), du kannst alles ignorieren, was gedruckt wird, nur der Rückgabewert der Ausführung ist wichtig. – dbemerlin

+0

Die Frage stellt sich "Perl ist auf dem System installiert". Ihre Antwort schließt die Automatisierung der "Perl nicht gefunden" -Antwort aus (Perl fehlt, oder wahrscheinlicher, nicht auf PATH). Zugegeben, bei jedem System, mit dem ich arbeite, wird Perl vom System installiert - aber der Fragesteller ist besorgt, "ist überhaupt da". –

14

Nein, schreibe kein Shell-Skript. Perl hat dafür schon eine ganz gute Möglichkeit. Der richtige Weg dazu ist, eine CPAN-fähige Distribution mit der normalen Toolchain zu erstellen. Einige davon sind in perlnewmod, perlmodstyle und perlmodinstall erläutert.

Für ein minimales Arbeitsbeispiel einer Verzeichnisstruktur erstellen also:

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

In der Build.PL Datei setzen:

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; 

ändern die Details Ihre Zwecke Hotel.

In der README Datei, einige Installationsanweisungen setzen, zum Beispiel:

To install this module, run the following commands: 

perl Build.PL 
./Build install 

Sobald Sie mit allem, was getan werden, Sie laufen:

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

Das in einem .tar.gz Archiv führen was du verteilen wirst. Sagen Sie Ihren Benutzern, sie sollten es wie jedes andere CPAN-Modul installieren, oder wenn sie nicht wissen, was das bedeutet, sollten sie die README lesen.

Wenn Sie Zeit haben, empfehle ich, Ihr Skript in ein Modul zu konvertieren. Das Programm pl2pm (kommt mit Perl) und das CPAN-Modul Module-Starter-PBP helfen Ihnen.

Wenn es die Lizenz zulässt, können Sie Ihren Code in CPAN hochladen, um ihn für Ihre Benutzer noch bequemer zu machen. Bitten Sie zuerst um Hilfe in den folgenden Orten: Mailingliste [email protected], Webforum PerlMonks, IRC-Kanal #toolchain auf MagNET (

+0

Nach CPAN-Standard, wenn ich meine eigenen .pm-Dateien habe, wo sollte ich es hinzufügen, sowohl in Build.PL und Dateistruktur? Und wenn ich mehr als ein Perl-Skript habe, sagen wir "script1.pl" und "script2.pl", wie kann ich es in Build.PL hinzufügen? Modulname => 'script1.pl, script2.pl' ,? Ich konnte dazu kein Beispiel finden. –

+0

Beispiel: Wenn Sie ein Hauptmodul mit der Paketdeklaration 'Fus :: Roh :: Da' haben, benennen Sie es um' Da.pm' und verschieben Sie es in 'lib/Fus/Roh/Da.pm'. In 'Build.PL' geben Sie [' Modulname => 'Fus :: Roh :: Da''] (http://p3rl.org/Module::Build::API#Modulname) an. Platzieren Sie Ihre beiden Skripte einfach in das Unterverzeichnis 'script', der Rest wird automatisch zur Installationszeit ausgeführt. - Sie können Ihre Build-Datei testen, indem Sie 'perl Build.PL --install_base/tmp; ./Build install' und überprüfe das Ergebnis im Verzeichnis '/ tmp'. Führen Sie './Build distclean' aus und entfernen Sie die installierten Dateien manuell, um von vorne zu beginnen. – daxim

+0

OK, ich habe getan, was du gesagt hast. Wo ist mein Skript jetzt? Ich habe erwartet, dass ich es irgendwo in/usr/bin kopiere, den Namen von script.pl in ein Skript ändere und ausführbare Rechte hinzufüge.Was ich bekomme, ist ein leeres Verzeichnis '/ usr/lib/perl5/site_perl/auto/TerminalHero'. BTW, Build könnte sanft über Root-Passwort fragen, anstatt zu schreien '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FEHLER: '/ usr/lib/perl5/site_perl/auto/TerminalHero' konnte nicht erstellt werden. Keine Schreibberechtigung für '/ usr/lib/perl5/site_perl/auto/TerminalHero' !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ' – ciembor

Verwandte Themen