2012-02-04 5 views

Respuesta

8

Algunos sistemas no reconocen la línea #!/usr/bin/perl al comienzo de las secuencias de comandos, por lo que intentar invocar un programa Perl por nombre en dicho sistema simplemente pasará la secuencia de comandos al shell. Para combatir esto, los programas portátiles de Perl comienzan con una línea que, cuando es interpretada por un shell POSIX estándar, ocasiona que el script pase al perl(1). El if 0 hace que la línea sea ignorada cuando la ejecuta Perl, y colocarla en una línea separada hace que shells la trate como un comando separado, ejecutando solo el eval 'exec /usr/bin/perl -w -S $0 ${1+"[email protected]"}' tan pronto como se lee.

+0

¡Muchas gracias! ¡Qué ingenioso realmente! –

+1

Me pregunto si todavía hay algún sistema que valga la pena preocuparse que no sea compatible con [shebangs] (http://en.wikipedia.org/wiki/Shebang_ (Unix)). –

+2

Tengo scripts que hacen esto para que se ejecuten bajo Solaris Y Linux. El shebang apunta a un Perl de Solaris, pero en Linux el script se ejecuta como shell, y la línea eval ejecuta un perl de Linux. Los archivos perls se instalan en ubicaciones impares, pero los archivos/directorios se comparten entre sistemas a través de NFS. – runrig

2

La línea es válida para las cubiertas y perl. En Perl, eval se omite debido al siguiente if 0. En shell, el mismo archivo se ejecuta en perl usando la evaluación.

+0

Sí, esta identificación también es una buena aclaración. ¡Gracias de nuevo! –

Cuestiones relacionadas