2010-05-07 19 views
39

¿Cuál de estos es mejor o más rápido de usar que la línea shebang para un script Perl?¿Qué debo usar para una línea shebang de scripts de Perl?

#! perl 

#! perl.exe 

#! fullpath/perl(/perl.exe) 

#! partialpath/perl(/perl.exe) 

Y, cuando se utiliza #!perl, cuando se trabaja en un sistema en particular, ¿cómo puedo encontrar en el guión which perl intérprete que estoy usando para que pueda poner eso a uno en la línea tinglado?


Y, si se utiliza un /path/path/perl, se * o ... permitió que se utilizará para las carpetas?

+0

Para responder a la segunda pregunta, 'print $^X' muestra la ruta al archivo ejecutable perl activo. – mob

+3

En MacOS X (y creo que la mayoría de las versiones de Unix), '#! Perl' no funciona en absoluto. Necesita un camino completo. –

Respuesta

7

Un Windows she-bang (deducido del bit perl.exe) parece irrelevante ya que su (ejem) "shell" probablemente ni siquiera lo analiza (corríjanme si estoy equivocado, podría haberlo cambiado últimamente).

Algunos indicadores de línea de comandos todavía pueden ser recogidos por el propio Perl (according to this thread).

6
  1. Como se señaló ChristopheD, puedo confirmar a partir de la práctica (ActivePerl en XP) que la línea tinglado no es realmente necesario en Windows.

    Una línea de shebang le dice a un intérprete de comandos de Unix a qué intérprete le debe pasar la secuencia de comandos.

    En Windows, el programa para pasar el script a estará determinado por asociaciones basadas en la extensión.

  2. En Unix, la tercera opción (ruta completa al ejecutable perl) es la mejor.

    Y sí, puede usar ".." en teoría (a shell no le importa) pero realmente no debería usar la ruta relativa: nunca sabrá cuál será su directorio de trabajo actual al ejecutar una secuencia de comandos.

1

Y, cuando se utiliza "#! Perl", cuando se trabaja en un sistema particular, ¿cuál es la impresión() para mostrar la ruta completa a perl.exe, que podrían incluirse en el Shebang Line?

Bueno, si usted está utilizando la instrucción de impresión que ya se está ejecutando el código Perl, así que ...

55

Si usted tiene que codificar # !, utilizar #!/usr/bin/env perl. ¿Por qué? Lo que desea es que el programa Perl se ejecute con Perl preferido del usuario. Ese va a ser el primero en su PATH. #!perl no hace lo que quiero decir, no busca en la RUTA del usuario, #!/usr/bin/env perl es la forma de hacerlo. /usr/bin/env siempre estará allí en los sistemas Unix.

Si el usuario está utilizando Windows, como han señalado otros, no importa. Windows no usa #! usa asociaciones de extensión de archivos. Asegúrese de que su programa se llame foo.pl o algo así y funcionará. ¡Pero incluye el #! línea de todos modos como algunas utilidades y editores hacen uso de ella.

Si envía el código, deje que el instalador se encargue de ello. ¡Tanto MakeMaker/Makefile.PL como Module::Build/Build.PL cambiarán tu #! línea para que coincida con el perl con el que el usuario solía instalar. Ellos se encargarán de este problema por ti.

Si está instalando código para su propio uso de producción, debe usar la ruta completa a una copia particular de perl. ¿Qué copia de perl? Uno específico para su proyecto. ¿Esto significa que necesita compilar Perl para cada proyecto? No, puedes hacer un enlace simbólico. Project foo podría tener /usr/local/bin/fooperl punto en /usr/bin/perl5.18. Use #!/usr/local/bin/fooperl. Ahora, si decide actualizar Perl, puede hacerlo por proyecto cambiando el enlace simbólico.

+4

En Unix, '#!/Usr/bin/env perl' puede causar un problema si hay más de una versión de Perl en una computadora. Por ejemplo, una cuenta de usuario tiene 'PATH' configurado para tener otro Perl antes de'/usr/bin/perl'. El usuario inicia sesión como "raíz". Entonces, cuando root intenta ejecutar un script del sistema, esto realmente ejecuta el perl que no es del sistema. Entonces las secuencias de comandos del sistema no deberían usar esto. –

+11

Motivo n. ° 19382 para que nunca se conecte como root. Use 'sudo'. ;) – Schwern

+2

Por supuesto, no todas las unixes ponen env en/usr/bin. – jrockway

1

Este es uno de los things which I dislike about Perl.

En Windows, si está utilizando ActiveState Perl al menos, si el archivo finaliza con .pl, el registro de Windows ejecutará el intérprete Perl por usted, independientemente de la línea de shebang. En Cygwin, no estoy seguro de por qué, pero #! perl también funciona. En Unix debes poner la ruta completa a tu ejecutable de Perl en la línea shebang. Schwern's idea of using env es conveniente, pero tiene algún peligro, como señalé en un comentario.

Es por eso que le sugiero que la mejor solución es empaquetar sus scripts de Perl como módulos de CPAN. Los instaladores de CPAN como Module :: Build luego cambiarán la línea shebang a la ruta completa a su intérprete Perl. (No estoy seguro si el instalador de Schwern, ExtUtils :: MakeMaker, hace esto o usa env, ya que no lo uso.)

+2

The Module :: Build #! El código de reparación provino de MakeMaker, que vino del libro rosado Camel. Todos codifican el camino a Perl. – Schwern

3

Si está desarrollando en Unix usando Perl y usa "perlbrew" fácilmente cambiar entre las diferentes versiones de Perl, entonces la línea shebang "! #/usr/bin/env perl" funciona bien.

4

Si está ejecutando CGI a través de Apache en Windows, se utiliza SHEBANG. Necesitarás el camino completo a perl.

2

La primera línea significa shebang. Básicamente le dice al programa dónde se encuentra el intérprete de Perl ya que Perl es el lenguaje interpretado. En Linux puede escribir en la terminal:

whereis perl 

que le dará la ubicación exacta de la misma. Por lo general, está dentro de /usr/bin/perl. Esto significa que usted quiere hacer tinglado con respecto a/usr/bin/perl

#! /usr/bin/perl 

use strict; 
use warnings; 
use v5.10.1; 
. 
. 
. 

Esto es sólo un poco de buenas prácticas, por lo tanto, es obviamente solución más rápida.

Espero que encuentre esto útil,

Gracias.

Cuestiones relacionadas