2011-09-30 19 views
8

Obviamente, esto se aplica igualmente a python, bash, sh, etc. sustituido por perl!Al crear scripts, ¿cuál es la diferencia entre #!/Usr/bin/perl y #!/Usr/bin/env perl?

La respuesta de Quentin a continuación fue claramente correcta, así que la acepté, pero supongo que lo que realmente quise decir fue '¿cuáles son los pros y los contras de las dos formas de usar #! invocar perl/python/bash como el intérprete de un script? '

+0

Esta pregunta realmente no tiene nada que ver con los lenguajes de script específicos, pero me dejaron marcado Perl porque ese es el ejemplo utilizado en el título. – agf

Respuesta

9

Uno hace referencia a un lugar común donde está instalado Perl. El otro hace referencia a un lugar común que env está instalado y le pregunta cuál es la ruta al perl predeterminado.

3

Usando env para encontrar el ejecutable, en lugar de encontrarlo usted mismo, hace un ejecutivo adicional, pero eso no debería importar la mayor parte del tiempo. Es conveniente y a menudo lo uso yo mismo.

Sin embargo, he tenido problemas con las personas que usan env en las secuencias de comandos del sistema. On one occasion, la instalación de un /usr/local/bin/perl rompió mi sistema para que no pudiera actualizarlo hasta que resolviera el problema. On another occasion, instalando un /usr/local/bin/python rompió el etiquetador ID3 que estaba usando. Creo que esto es más un problema de empaquetado que un problema inherente con env. Si está instalando algo en un sistema, ¿por qué está comprobando cuidadosamente que tiene una versión de Python que satisfaga todas sus dependencias si solo va a dejar una línea de shebang que busque una versión anterior de Python cada vez? se ejecuta?

+0

No veo ninguna razón por la cual 'env' deba bifurcar otro proceso. ¿Te refieres a "ejecutivos" o, alternativamente, te importaría expandir sobre el tema? –

+0

Sí. Publicación actualizada ¡Gracias! – oylenshpeegul

1

que le puede dar un ejemplo concreto:

Imagine que tiene un paquete de lámpara instalada en/opt/(es decir XAMPP) que incluye su propio ejecutable Perl, bibliotecas y gerente Pakage.

En realidad, desea ejecutar ese ejecutable para que agregue la ruta a los ejecutables LAMP en su variable de entorno PATH (RUTA = "/ opt/XAMPP/bin: $ PATH").

Ahora cualquier script que use "#!/Usr/bin/env perl" ejecutará el binario perl en el directorio de la pila LAMP. La otra ruta ejecutará el binario Perl preinstalado en su sistema, en "/ usr/bin/perl".

Depende de usted decidir qué es mejor para su script de Perl.

7

Estas son buenas reglas, si usted tiene una buena razón para romperlas, no dude en hacerlo:

Uso #!/usr/bin/env perl siempre que sea posible para la portabilidad entre sistemas heterogéneos. Pero esa es una manera tonta de hacerlo porque supone que el Perl que está primero en el camino es también el Perl que siempre deseas. Eso puede no ser así, y generalmente cuando hay varios Perls en un sistema, están ahí por una cierta razón.

Un mejor enfoque es empaquetar scripts en una distribución preparada para CPAN. Distribuya las distribuciones a los sistemas en los que desee instalarlas e instálelas de la forma habitual (manualmente o con la cadena de herramientas CPAN), especificando la ruta completa a perl o cpan. Durante ese proceso, the shebang line is rewritten a la ruta correcta a Perl.

Ejemplos:

tar -xvf Local-OurCompany-Scripts-1.000.tar.gz 
cd Local-OurCompany-Scripts-1.000 

## automated installation 
/usr/bin/cpan . 
# or perhaps 
/opt/ourcompany/perls/perl-5.14.2/bin/cpan . 

## manual installation 
/usr/bin/perl Makefile.PL ; make ; make install 
# or perhaps 
`which perl5.14.2` Makefile.PL ; make ; make install 
+2

Pero se olvida que la manipulación de la ruta se realiza fácilmente: usar 'env' le permite utilizar diferentes perls para diferentes programas (o incluso el mismo programa en diferentes momentos). El uso de una ruta de perl codificada y la capacidad de reescritura de ruta de CPAN supone que el perl utilizado para realizar la instalación es el perl que siempre deseas, lo que yo diría que es una suposición mayor (y peor) que la hecha por 'env', ya que requiere modificar el origen para anularlo, en lugar de un simple "PATH =/path/to/other/perl: $ PATH some_perl.pl". –

+0

Estoy de acuerdo con esta parte: _ "Pero esa es una manera tonta de hacerlo porque supone que el Perl que está primero en el camino también es el Perl que siempre deseas" _ y agregaría que supone que tu script funciona bien con cualquier instancia de Perl (y Perl-Modules) que encuentre. – Gonen

Cuestiones relacionadas