Busqué en Google aproximadamente #!/usr/bin/perl
, pero no pude encontrar ninguna respuesta satisfactoria. Sé que es algo bastante básico, pero aún así, ¿podría explicarme cuál es la importancia de #!/usr/bin/perl
en Perl? Además, ¿qué significa -w
o -T
en #!/usr/bin/perl
? Soy un novato para Perl, así que por favor se paciente.¿Cuál es la importancia de -T o -w en #!/Usr/bin/perl?
Respuesta
The #! comúnmente se llama "shebang" y le dice a la computadora cómo ejecutar un script. También verá muchos guiones de shell con #!/bin/sh
o #!/bin/bash
.
Por lo tanto, /usr/bin/perl
es su intérprete de Perl y se ejecuta y se le da el archivo para ejecutar.
El resto de la línea son opciones para Perl. El "-T" is tainting (significa que la entrada está marcada como "no confiable" hasta que verifique su formato). La "-w" enciende las advertencias.
Puede encontrar más información ejecutando perldoc perlrun (perldoc es el lector de documentación de Perl, podría estar instalado, podría estar en su propio paquete).
Para los scripts se escribe lo recomendaría empezar con:
#!/usr/bin/perl
use warnings;
use strict;
Esto activa un montón de advertencias y controles adicionales - especialmente útil cuando se está aprendiendo (todavía estoy aprendiendo y yo he estado usando Perl por más de 10 años ahora).
Aquí hay una consulta. Cuando requiero otro archivo .pl a un archivo que tenga #!/Usr/bin/perl -T, arroja un error. Y cuando elimino -T, se ejecuta. ¿Cuál es el motivo? Gracias. – vijay
Se llama shebang. En los sistemas basados en Unix (OSX, Linux, etc.) esa línea indica la ruta al intérprete de idioma cuando el script se ejecuta desde la línea de comando. En el caso de perl/usr/bin/perl es la ruta al intérprete de Perl. Si se omite el hashbang, los sistemas * nix no sabrán cómo analizar el script cuando se invoque como un ejecutable. En cambio, tratará de interpretar el script en cualquier shell que el usuario esté ejecutando (probablemente bash) y romperá el script.
http://en.wikipedia.org/wiki/Hashbang
El -W y -T son argumentos que CONTROLL la forma en que el intérprete de Perl opera. Son los mismos argumentos que puede invocar cuando llama al intérprete de Perl directamente desde la línea de comandos.
- -W muestra advertencias (también conocido como información de depuración).
- -T activa la comprobación de contaminación/seguridad.
Tanto -w
y -T
son una especie de banderas "a toda prueba".
-w
es lo mismo que la declaración use warning
en su código, y es una opción de advertencia equivalente en muchos compiladores.Un ejemplo sencillo sería una advertencia sobre el uso de variables sin inicializar:
#!/usr/bin/perl -w
print "$A\n";
print "Hello, world!\n";
imprimirá:
Name "main::A" used only once: possible typo at ./perl-warnings line 3.
Use of uninitialized value $A in concatenation (.) or string at
./perl-warnings line 3.
Hello, world!
significa La bandera -T
que cualquier valor que viene del mundo exterior (como opuesta a la que se calcula el interior de la programa) se considera una amenaza potencial y no permite el uso de dichos valores en operaciones relacionadas con el sistema, como escribir archivos, ejecutar comandos del sistema, etc. (Por eso Perl activará el modo "contaminación" cuando el script se ejecuta bajo setuid/setgid.)
El modo "contaminado" lo "obliga" a volver a verificar el valor dentro del script.
Por ejemplo, el código:
#!/usr/bin/perl -T
$A = shift;
open FILE, ">$A";
print "$A\n";
close FILE;
producirá un error fatal (que termina el programa):
$ ./perl-tainted jkjk
Insecure dependency in open while running with -T switch at
./perl-tainted line 3.
Y eso es sólo porque el valor del argumento vino de "afuera" y no fue " doblemente verificado". El modo "contaminación" está llamando su atención sobre ese hecho. Por supuesto, es fácil engañarlo, por ejemplo:
#!/usr/bin/perl -T
$A = shift;
$A = $1 if $A =~ /(^.*$)/;
open FILE, ">$A";
print "$A\n";
close FILE;
En este caso todo funcionó bien. Usted "engañó" el "modo de contaminación". Bueno, la suposición es que las intenciones del programador son hacer que el programa sea más seguro, por lo que el programador no solo solucionará el error, sino que más bien tomará algunas medidas de seguridad. Uno de los apodos de Perl es "el pegamento y la cinta aislante de los administradores del sistema". No es improbable que el administrador del sistema cree el script Perl para sus propias necesidades y lo ejecute con los permisos root
. Piense en este guión haciendo algo que los usuarios normales no pueden hacer ... probablemente quiera verificar dos veces las cosas que no son parte del programa, y quiere que Perl le recuerde sobre ellas.
Espero que ayude.
'-w' no es lo mismo que' use warnings; '. El pragma tiene un alcance léxico. – friedo
sobre "-w es lo mismo que advertencia de uso". eso no es exactamente correcto -W enciende las advertencias en cualquier parte (ignorando $^W o sin advertencias), -w activa las advertencias en cualquier lugar, excepto cuando $^W se establece en 0 o no se usa ninguna advertencia. "usar advertencias" tiene un alcance léxico. – tinita
sobre el Modo Mancha (-T):
require
y use
declaraciones cambiar cuando el modo mancha está encendida.
La ruta para cargar bibliotecas/módulos ya no contiene .
(el directorio actual) desde su ruta.
Por lo tanto, si carga cualquier biblioteca o módulo relativo al directorio de trabajo actual sin especificar explícitamente la ruta, su secuencia de comandos se romperá en el modo de contaminación.
Por ejemplo: Considere perl_taint_ex.pl
#!/usr/bin/perl -T
require "abc.pl";
print "Done";
fallarían como esto
D:\perlex>perl perl_taint_ex.pl
"-T" is on the #! line, it must also be used on the command line
at perl_taint_ex.pl line 1.
D:\perlex>perl -T perl_taint_ex.pl
Can't locate abc.pl in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib)
at perl_taint_ex.pl line 3.
Por eso, cuando el modo de mancha está en, debe informar a la declaración exigir explícitamente dónde cargar la biblioteca desde .
se elimina durante el modo de contaminación de la matriz @INC
.
@INC
contiene una lista de rutas válidas para leer archivos y módulos de bibliotecas.
Si el modo de mancha está en, sólo tiene que hacer lo siguiente:
D:\perlex>perl -ID:\perlex -T perl_taint_ex.pl
Done
-ID:\perlex
incluirá directorio D:\perlex
en @INC
.
Puede probar otras formas para agregar la ruta a @INC
, este es solo un ejemplo.
Esta explicación proporciona una buena explicación de lo que sucede si no utiliza el parámetro -T correctamente desde la línea de comandos, sino que lo especifica en la línea shebang de un script de Perl. Útil. – pdwalker
- 1. ¿Cuál es la importancia de # en SQL?
- 2. ¿Cuál es la importancia de -532459699?
- 3. ¿Cuál es la diferencia entre% W y W%
- 4. ¿Cuál es la importancia de un guión bajo en Perl ($ _, @_)?
- 5. ¿Cuál es la importancia de 0.0f al inicializar (en C)?
- 6. ¿Cuál es la importancia de IMetadataExchange en WCF?
- 7. ¿Cuál es la importancia de establecer la capacidad de `IList`?
- 8. ¿Cuál es la importancia de "#" o "#!" que aparece en la url del sitio web
- 9. ¿Cuál es la importancia del 12 de octubre de 1999?
- 10. ¿Cuál es la importancia de comenzar constantes con 'k'?
- 11. ¿Cuál es la importancia de los tipos MIME correctos?
- 12. ¿Cuál es la importancia del esquema en el servidor sql?
- 13. ¿Cuál es la clave <C-w> en Vim?
- 14. ¿Cuál es la diferencia entre: actualizar y: w en Vim?
- 15. ¿Cuál es la importancia del retorno por referencia?
- 16. Cuál es la verdadera importancia (uso) del polimorfismo
- 17. ¿Cuál es la diferencia entre% w {} y% W {} por ciento mayúsculas y minúsculas literales de matriz W en Ruby?
- 18. ¿Cuál es la diferencia b/w Design and Architecture?
- 19. Cómo importar org.apache Java dependencias w/o w/o Maven
- 20. ¿Cuál es la importancia del orden de las declaraciones en la salida de explicación de mysql?
- 21. Importancia y especialidad de la función de función importancia
- 22. ¿Cuál es dif b/w scheduleAtFixedRate y el calendario:
- 23. Cuál es la importancia de un Nodo maestro de Mnesia en un clúster
- 24. ¿Cuál es la importancia de una matriz de 0 longitudes en C?
- 25. ¿Cuál es la diferencia entre Test t; y Prueba t() ;? Si la prueba es una clase
- 26. ¿Cuál es la importancia/uso de hacer vacío (param); al comienzo de la función?
- 27. ¿Cuál es la importancia de la propiedad del constructor de Javascript?
- 28. ¿Cuál es la importancia de 1/1/1753 en SQL Server?
- 29. ¿Cuál es la importancia de un IDE cuando se programa en Python?
- 30. ¿Cuál es la diferencia entre ";" y "IR" en T-SQL?
'#!/Usr/bin/perl' se llama línea shebang. '-w' para advertencias'-T' para modo Taint. –
'-w' no ha sido recomendado por muchos años. Desde Perl 5.6.0 hemos tenido 'use warnings' que es más poderoso y más flexible. –