2012-09-08 15 views
6

Soy relativamente nuevo en Perl y estoy trabajando en archivos Perl escrito por otra persona, y sigo encontrando la siguiente declaración al comienzo de los guiones:cadena larga eval en el beginnning de script de Perl

eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"[email protected]"}' && eval 'exec perl -w -S $0 $argv:q' 
    if 0; 

¿Qué hacen estas dos líneas? ¿Qué es la verificación de código? y ¿Qué significa la oración if 0;?

Respuesta

8

Esta es una variante del hack exec. En los días previos a que los intérpretes pudieran ser especificados de manera confiable con un #!, esto se usó para hacer que el shell exec perl. El if 0 en la segunda línea nunca es leído por el intérprete de comandos, que solo lee la primera línea y ejecuta perl, que lee if 0 y no se vuelve a ejecutar.

Esta es una variante interesante, pero creo que no es del todo correcta. Parece estar configurado para funcionar con la shell bourne o con las variantes csh, utilizando la evaluación inicial para determinar el shell que está analizando y luego usando la sintaxis apropiada para pasar los argumentos a perl. La cláusula media es sintaxis sh y la última cláusula es apropiada para csh. Si el segundo && fuera || y el eval '(exit $?0)' inicial fallara realmente en csh, entonces esto lograría esos objetivos, pero tal como está escrito, no creo que funcione para csh. ¿Hay algún comando que preceda a esto que establecería $? en algún valor basado en el shell? Pero incluso si ese fuera el caso y $? se establece en un valor distinto de cero, entonces no se ejecutará nada a menos que && se sustituya por ||. Algo gracioso está sucediendo.

+0

Gracias! ¿Qué es el 'exec hack'? ¿Te refieres a un 'shebang'? –

+0

El hack de exec es básicamente cualquier técnica que usa exec para invocar un intérprete específico en lugar de usar una línea de shebang. –

+0

Gracias! ¿Cuál sería la línea equivalente de 'shebang' entonces? De alguna manera, esta verificación 'eval' parece mucho más compleja que el simple hecho de solicitar el uso de un binario/intérprete específico. –

Cuestiones relacionadas