2010-04-09 11 views
6

Ho scritto uno script Perl, voglio solo darlo a tutti, per questo ho pianificato di scrivere uno script di bash che viene utilizzato per testare l'ambiente di un utente e scoprire se quell'ambiente è in grado di eseguire il Perl script.Come verificare la disponibilità di Perl, la sua versione e la presenza di un modulo richiesto?

Voglio testare le cose come:

  1. Sia Perl ha installato in quel sistema
  2. Perl dovrebbe avere la versione 5 o più
  3. Se il modulo di JSON :: Qualsiasi è disponibile

Qualsiasi suggerimento sarebbe molto apprezzato :-)

risposta

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 

Io uso spesso '${PERL:-perl}' e costrutti simili per identificare il comando (per awk vs nawk o gawk; troff vs groff; eccetera).

Se si desidera testare la versione di JSON :: Any, acquisire invece l'output dal comando. Se si desidera testare la versione di Perl, aggiungere "use 5.008009;" o qualsiasi numero che si ritiene ragionevole. (Non è passato molto tempo da quando hanno finalmente rimosso Perl 4 da uno dei file system montati su NFS al lavoro - ma non era l'unico Perl sulla macchina - almeno, non nell'ultimo decennio o più!)

+0

Preferirei 'perl -MJSON :: Any -e1 2>/dev/null' - c'è un punto in cui stampare la versione e inviarla a un po 'bucket – justintime

+0

@justintime: Come ho detto, se vuoi controllare il versione di JSON :: Any, cattura l'output - mi ha salvato dover spiegare come ottenere la versione come esercizio separato. –

8

quanto riguarda il controllo disponibil Perl ility il modo più semplice per farlo è controllare il codice di ritorno (codice di uscita) del comando perl -v, se questo non è 0, non hai Perl.

Ora per quanto riguarda i requisiti Perl, si dovrebbe accordo con loro da dentro il vostro script Perl:

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

È possibile che questo Perl codice verrà eseguito solo con Perl 5.6.1 o più recente e con modele versione "ModuleName" 2.0 o più recente. Non è necessario controllare manualmente la versione Perl da bash, è meglio e più facile farlo direttamente dallo script Perl.

Riferimenti:

+0

Non voglio stampare più dettagli, I voglio solo sapere il numero di versione, quando emetto il comando perl -v, qualsiasi suggerimento – abubacker

+0

Puoi controllare il numero di versione in perl stesso con 'use 5.006_001'. perl -v controlla solo se un binario perl può essere eseguito (=> Controlla se perl è installato), puoi ignorare tutto ciò che stampa, solo il valore di ritorno dell'esecuzione conta. – dbemerlin

+0

La domanda chiede "È installato perl nel sistema". La tua risposta preclude l'automazione della risposta "perl non trovata" (mancante perl, o più probabilmente, non su PATH). Certo, ogni sistema con cui lavoro ha installato Perl dal sistema - ma l'interlocutore è preoccupato di 'perl lì a tutti'. –

14

No, non scrivere uno script di shell. Perl ha già un modo perfetto per farlo. Il modo corretto per farlo è creare una distribuzione pronta per CPAN usando la normale toolchain. Alcuni di questi sono spiegati in perlnewmod, perlmodstyle e perlmodinstall.

Per un esempio di lavoro minimo, creare un layout directory così:

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

Nel file Build.PL, messo:

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; 

Modificare i dettagli di serie i vostri scopi.

Nel file README, mettere un po 'istruzioni per l'installazione, per esempio:

To install this module, run the following commands: 

perl Build.PL 
./Build install 

Una volta che hai finito con tutto questo, si esegue:

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

Questo si tradurrà in un archivio .tar.gz che distribuirai. Dì ai tuoi utenti di installarlo come qualsiasi altro modulo CPAN, o se non sanno cosa significa, dovrebbero leggere il README.

Se hai tempo, ti consiglio di convertire lo script in un modulo. Il programma pl2pm (fornito con Perl) e il modulo CPAN Module-Starter-PBP ti aiutano.

Se la licenza lo consente, è possibile caricare il codice su CPAN per renderlo ancora più conveniente per i propri utenti. Chiedi aiuto in uno dei seguenti posti: mailing list [email protected], forum web PerlMonks, canale IRC#toolchain su MagNET (irc: //irc.perl.org/toolchain)

+0

Secondo lo standard CPAN, se ho i miei file .pm dove devo aggiungerlo, sia in Build.PL che nella struttura dei file? e anche se ho più quel singolo script Perl, diciamo 'script1.pl' e 'script2.pl', come posso aggiungerlo in Build.PL? module_name => 'script1.pl, script2.pl' ,? Non ho trovato un esempio su questo. –

+0

Esempio: se si ha un modulo principale con la dichiarazione del pacchetto 'Fus :: Roh :: Da', rinominarlo' Da.pm' e spostarlo in 'lib/Fus/Roh/Da.pm'. In 'Build.PL', specifica [' module_name => 'Fus :: Roh :: Da''] (http://p3rl.org/Module::Build::API#module_name). È sufficiente posizionare i due script nella 'sottodirectory' script', il resto funzionerà automaticamente al momento dell'installazione. - Puoi testare il tuo file Build eseguendo 'perl Build.PL --install_base/tmp; ./Build install' e controlla il risultato nella directory '/ tmp'. Esegui './Build distclean' e rimuovi manualmente i file installati per ricominciare. – daxim

+0

OK, ho fatto quello che hai detto. Dov'è il mio script ora? Mi aspettavo di copiarlo da qualche parte in/usr/bin, cambiare nome da script.pl in script e aggiungere diritti eseguibili.Quello che ottengo è una directory vuota '/ usr/lib/perl5/site_perl/auto/TerminalHero'. A proposito, Build potrebbe chiedere gentilmente la password di root invece di urlare '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ERRORE: impossibile creare '/ usr/lib/perl5/site_perl/auto/TerminalHero' Non avere permessi di scrittura su '/ usr/lib/perl5/site_perl/auto/TerminalHero' !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ' – ciembor

Problemi correlati