2010-04-09 20 views
6

He escrito un script Perl, solo quiero dárselo a todos, para eso planeé escribir un script bash que se usa para probar el entorno de un usuario y determinar si ese entorno es capaz de ejecutar el Perl guión.¿Cómo verificar la disponibilidad de Perl, su versión y la presencia de un módulo requerido?

Quiero probar las cosas como:

  1. Si Perl ha instalado en ese sistema
  2. Perl debe tener la versión 5 o más
  3. Si el módulo de JSON :: Cualquier está disponible

Cualquier sugerencia sería muy apreciada :-)

Respuesta

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 

menudo uso '${PERL:-perl}' y construcciones similares para identificar el comando (por awk vs nawk o gawk; troff vs groff; etc.)

Si desea probar la versión de JSON :: Any, capture la salida del comando en su lugar. Si desea probar la versión de Perl, agregue 'use 5.008009;' o el número que considere oportuno. (No hace mucho tiempo que finalmente eliminaron Perl 4 de uno de los sistemas de archivos montados en NFS en el trabajo, pero ese no era el único Perl en la máquina, al menos, ¡no en la última década o más!)

+0

Prefiero 'perl -MJSON :: Cualquiera -e1 2>/dev/null' - ¿Hay algún punto en la impresión de la versión y enviarla a un cubo de bits – justintime

+0

@justintime: Como he dicho, si desea comprobar el versión de JSON :: Any, capture the output - me ahorró tener que explicar cómo obtener la versión como un ejercicio separado. –

8

En cuanto a la comprobación availab Perl La forma más fácil de hacerlo es verificar el código de retorno (código de salida) del comando perl -v, si no es 0, no tiene Perl.

Ahora respecto a los requisitos de Perl, que debe trato con ellos desde el interior de su script Perl:

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

Lo anterior Perl código se ejecutará sólo con el Perl 5.6.1 o posterior y con modele "ModuleName" versión 2.0 o más nuevo. No es necesario comprobar manualmente la versión de Perl desde bash, es mejor y más fácil hacerlo directamente desde el script de Perl.

Referencias:

+0

No quiero imprimir más detalles, solo quiero saber el número de versión solamente, cuando ejecuto el comando perl -v, cualquier sugerencia – abubacker

+0

Verifique el número de versión en perl con 'use 5.006_001'. perl -v simplemente comprueba si se puede ejecutar un binario de Perl (=> Verifique si Perl está instalado), puede ignorar todo lo que imprime, solo importa el valor de retorno de la ejecución. – dbemerlin

+0

La pregunta sí pregunta "¿Está Perl instalado en el sistema?". Su respuesta no permite la automatización de la respuesta "perl no encontrado" (perl falta, o más probablemente, no en PATH). De acuerdo, todos los sistemas con los que trabajo tienen Perl instalado por el sistema, pero el que pregunta está preocupado porque "no está ahí para nada". –

14

No, no escriba un script de shell. Perl ya tiene una forma perfectamente buena de hacer esto. La forma correcta de hacerlo es crear una distribución preparada para CPAN utilizando la cadena de herramientas normal. Algo de esto se explica en perlnewmod, perlmodstyle y perlmodinstall.

Para un ejemplo de trabajo mínima, crear una estructura de directorios así:

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

En el archivo Build.PL, poner:

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; 

cambiar los detalles de la habitación sus propósitos.

En el archivo README, poner algunas instrucciones de instalación, por ejemplo:

To install this module, run the following commands: 

perl Build.PL 
./Build install 

Una vez que haya terminado con todo eso, se ejecuta:

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

Esto resultará en un archivo .tar.gz que distribuirá Dígales a sus usuarios que lo instalen como cualquier otro módulo de CPAN, o si no saben lo que eso significa, deben leer el archivo README.

Si tiene tiempo, le recomiendo que convierta su secuencia de comandos a un módulo. El programa pl2pm (viene con Perl) y el módulo CPAN Module-Starter-PBP le ayudan.

Si la licencia lo permite, es posible cargar su código en CPAN para hacerlo aún más conveniente para sus usuarios. Pida ayuda en cualquiera de los siguientes lugares primero: lista de correo [email protected], foro web PerlMonks, canal IRC#toolchain en MagNET (irc: //irc.perl.org/toolchain)

+0

De acuerdo con el estándar CPAN, si tengo mis propios archivos .pm ¿dónde debo agregarlos, tanto en Build.PL como en la estructura de archivos? y también si tengo más de un script de Perl, digamos 'script1.pl' y 'script2.pl', ¿cómo puedo agregarlo en Build.PL? module_name => 'script1.pl, script2.pl' ,? No pude encontrar un ejemplo sobre esto. –

+0

Ejemplo: si tiene un módulo principal con la declaración del paquete 'Fus :: Roh :: Da', cambie el nombre' Da.pm' y muévalo a 'lib/Fus/Roh/Da.pm'. En 'Build.PL', especifique [' module_name => 'Fus :: Roh :: Da''] (http://p3rl.org/Module::Build::API#module_name). Simplemente coloque sus dos scripts en el subdirectorio 'script', el resto se resuelve automáticamente en el momento de la instalación. - Puede probar su archivo de compilación ejecutando 'perl Build.PL --install_base/tmp; ./Build install' y verifique el resultado en el directorio '/ tmp'. Ejecute './Build distclean' y elimine manualmente los archivos instalados para empezar de nuevo. – daxim

+0

OK, hice lo que dijiste. ¿Dónde está mi guión ahora? Esperaba copiarlo en algún lugar en/usr/bin, cambiar el nombre de script.pl a script y agregar derechos ejecutables.Lo que obtengo es un directorio vacío '/ usr/lib/perl5/site_perl/auto/TerminalHero'. Por cierto, Build podría preguntar suavemente sobre la contraseña de root en lugar de gritar '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ERROR: No se puede crear '/ usr/lib/perl5/site_perl/auto/TerminalHero' No tiene permisos de escritura en '/ usr/lib/perl5/site_perl/auto/TerminalHero' !!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!! ' – ciembor

Cuestiones relacionadas