2011-03-18 7 views
6

Estoy buscando a alguien que confirme o corrija autoritariamente lo que creo que sé sobre la opción -CSDA en la línea shebang de un script de Perl.¿De qué sirve que se especifique -CSDA solo en la línea shebang?

Consulte perldoc perlrun para la documentación de -CSDA. Brevemente

  • S: STDIN, STDOUT y STDERR se supone que son en UTF-8
  • D: UTF-8 es la capa PerlIO predeterminado para la entrada y salida de corrientes
  • A: @ARGV se espera que los elementos a ser cadenas codificadas en UTF-8
  • Para que -CSDA tenga algún efecto, se debe especificar en la línea de comando como en perl -CSDA script.pl.

  • Antes de 5.10, -CSDA en la línea shebang fallaría en silencio debido a que los flujos estándares ya habrían sido abiertos y @ARGV ya incluido en el momento en que se encontró a menos -CSDA ya se especificó en la línea de comandos también.

  • Después de 5.10, -CSDA que aparece solo en la línea shebang provoca perl croar debido a ese problema.

  • Un guión con -CSDA que utiliza para trabajar con perl s pre-5.10 debe tener la -CSDA retirados de la línea shebang porque nunca se invocó con esas opciones en la línea de comandos (y las opciones, si se especifica únicamente en el línea shebang, no hizo nada).

Me encantaría obtener algunos comentarios sólidos sobre cuáles de mis suposiciones anteriores son incorrectas.

Respuesta

3

No estoy seguro de lo autoritario que soy, pero sé cómo funciona esto.

  • Su primera suposición es casi exacta. Para que las opciones de SDA tengan algún efecto, deben estar presentes cuando se inicia el intérprete. Eso podría deberse a -CSDA en la línea de comandos, o podría deberse a la variable de entorno PERL_UNICODE, o posiblemente a algún otro método que desconozco.
  • Su segunda suposición es correcta, al menos para 5.8.8. Tenga en cuenta que la bandera D todavía tendría su efecto normal para las secuencias abiertas por la secuencia de comandos.
  • Su tercera suposición es correcta. Sin embargo, comenzando con 5.10.1, no sonará si los indicadores apropiados están habilitados a través de la variable de entorno PERL_UNICODE o algún otro mecanismo.
  • Su cuarta suposición es no generalmente correcta. Supongo que se refiere a la situación cuando el script se invoca directamente, en lugar de invocar el intérprete de Perl con el guión como argumento. Hay dos casos generales.
    • En un sistema donde el sistema operativo determina que cualquier archivo con la extensión ".pl" se pasará al intérprete de Perl para su ejecución, como Windows, puede estar en lo cierto.Pero podría argumentarse que el guión croar cuando se invoca sin -CSDA es el comportamiento deseado, en lugar de cosas que misteriosamente fallan porque la entrada estándar y @ARGV no son UTF-8 como espera el script.
    • En un sistema que lee la línea shebang cuando se ejecuta directamente una secuencia de comandos, como la mayoría de las conchas * nix, las opciones de línea de comando especificadas en la línea shebang se utilizarán al invocar el intérprete y, por lo tanto, -CSDA en la línea shebang será ser honrado.
+1

+1. Para el último elemento, en sistemas donde '/ usr/bin/perl' no es el intérprete, pero es un programa que decide qué versión de' perl' invocar (por ejemplo, como en sistemas OS X donde '5.8' y' 5.10' coexistir), '-CSDA' en la línea shebang hace que' perl' gracie cuando se invoca. –

+0

Si fuera así, sería un error en el script de contenedor. Pero cuando lo comprobé en una Mac, descubrí que el problema es que 5.10.0 (que viene con OS X 10.6.6) no permite -C siempre, mientras que 5.10.1 (que es lo que tengo en mi máquina Linux) lo permite si los indicadores especificados ya están activos. La especificación de perl5.8.9 en el shebang hace honor a -CSDA correctamente. – Anomie

+0

Gracias por la aclaración. Muy apreciado. –

3

Si el guión es

#!/usr/bin/perl -CSDA 

e inicia la secuencia de comandos utilizando

./script foo 

El sistema operativo se lanzará Perl de la siguiente manera:

/usr/bin/perl -CSDA ./script foo 

El cambio en comportamiento sólo entra en juego si lanzar el guión de forma incorrecta, como por ejemplo mediante el uso de

/usr/bin/perl ./script foo 

La solución no es quitar -CSDA, la solución es llamar a la secuencia de comandos correctamente.

+0

Depende. Estoy tratando de averiguar si '-CSDA' alguna vez tuvo algún efecto en el funcionamiento de este programa que estoy tratando de entender. –

+0

@Sinan Ünür, ¿Imprime en STDOUT o STDERR? ¿Lees de STDIN? Entonces, si espera lidiar con algo fuera del rango ASCII, entonces debe usarlo o algo equivalente. – ikegami

+0

Sí, bueno, no sé y eso es parte del problema. –

Cuestiones relacionadas