2009-02-20 9 views
17

Quiero ejecutar perl -w usando env. Eso funciona muy bien en la línea de comandos :¿Puedo usar los modificadores de perl con/bin/env en la línea shebang?

$ /bin/env perl -we 'print "Hello, world!\n"' 
Hello, world! 

Pero no funciona en la línea shebang en un script:

#!/bin/env perl -w 
print "Hello, world!\n"; 

Aquí está el error:

/bin/env: perl -w: No such file or directory 

Aparentemente env no entiende la bandera -w que estoy pasando al perl. ¿Qué pasa?

+0

Vea también cómo hacerlo con un hacker de shell [uno] (http://stackoverflow.com/a/9051635/128583) y [dos] (http://stackoverflow.com/a/3306658/128583) – Davorak

Respuesta

25

El hash-bang no es una línea de comandos de shell normal, el análisis y el manejo del espacio en blanco es diferente; eso es lo que has logrado. Ver:

Básicamente muchos/la mayoría de sistemas Unix poner todo el texto restante después del primer espacio en un solo argumento.

Así:

#!/bin/env perl -w 

es el equivalente a:

/bin/env "perl -w" 

por lo que necesita para manejar todas las opciones para el intérprete perl de alguna otra manera. es decir,

use warnings; 

(como @Telemachus)

15

En lugar de usar el pragma -w advertencias (para las versiones modernas de Perl):

#!/bin/env perl 
use warnings; 
use strict; 
+0

Sí, sé sobre "usar advertencias", pero estoy acostumbrado a escribir "perl -w" y estoy confundido de que "env" funcionaría en la línea de comandos, pero no en el guión. – Frank

+0

"perl -w" funciona en Unix, y es más conciso, pero no funciona en Windows (a menos que sea ActivePerl o lo que haya buscado explícitamente indicadores de línea de comandos en una línea shebang), así que es mejor simplemente "usar advertencias; ". –

-1

Están olvidando el directorio /usr.

+1

env puede estar en diferentes ubicaciones. En mi sistema está en/bin/env con un enlace suave a/usr/bin/env. Dado que funciona desde la línea de comando, supongo que tiene la ruta correcta del programa. – gpojd

+1

Sería más portátil usar/usr/bin/env. –

5

pensé que podría ser útil para mostrar que "w" no es lo mismo que "usar advertencias". -w se aplicará a todos los paquetes que use, "usar advertencias" solo se aplicará léxicamente. Por lo general, no quiere usar o confiar en "-w"

2

Vale la pena señalar que el Mac OS X interpreta los caracteres después del tinglado como argumentos, por lo que en OS X, el siguiente trabajo:

#!/usr/bin/env perl -wT 
enter code here 

Sin embargo, dado que uno de los puntos de usar #!/Usr/bin/env es fomentar la compatibilidad multiplataforma, probablemente sea mejor no usar esa sintaxis incluso si está en una Mac principalmente.

Cuestiones relacionadas