he observado que hay dos formas de ejecutar un programa Perl:¿Cuál es la diferencia entre "perl test.pl" y "./test.pl"?
perl test.pl
y
./test.pl
¿Cuál es la diferencia exacta entre estos dos y cuál es recomendable?
he observado que hay dos formas de ejecutar un programa Perl:¿Cuál es la diferencia entre "perl test.pl" y "./test.pl"?
perl test.pl
y
./test.pl
¿Cuál es la diferencia exacta entre estos dos y cuál es recomendable?
En el primer caso está iniciando el intérprete perl
y pidiéndole que use su archivo y lo ejecute.
En el segundo caso le está pidiendo a su shell que ejecute su archivo. Esto requiere que el archivo comience con
#!/<path to perl>/perl
y que el archivo tenga el bit de ejecución establecido.
El mejor método para usar es el que mejor se adapte a su uso.
La primera ejecuta el programa utilizando el perl
que se encuentra primero en su $PATH
. El segundo usa cualquier línea shebang en el programa.
El primero de ellos siempre se ejecutará la secuencia de comandos como el código perl
.
El segundo solo lo hará en caso de que el perl se especifique en she-bang. De lo contrario, se ejecutará como código de shell o lo que sea especificado en she-bang (si no hay she-bang en absoluto, se ejecutará como código de shell actual).
Se ejecutará el primero, incluso noexec
la opción de montaje está habilitada.
El segundo error en ese caso.
Lo mismo con el bit de ejecución. El primero funcionará si +x
no está configurado, el segundo fallará.
¿Estás seguro de que falta shebang es el código de "shell actual" en comparación con el shell del sistema? Parece ser el primero pero estoy inseguro – DVK
Voy a volver a expresar ligeramente lo que dicen otras respuestas.
El primer caso se ejecutará el programa llamado "perl" - presumiblemente, un intérprete de lenguaje Perl, y pasar el valor "test.pl" a él como el primer parámetro. Tenga en cuenta que esto va a hacer una de las 3 cosas, dependiendo de lo "perl" y lo que es "test.pl" es:
Si "perl" no existe como un archivo ejecutable en su $PATH
o una concha alias (compruebe si ejecuta which perl
), su shell tratará de encontrar un ejecutable inexistente, y fallará con el error perl: Command not found
.
Si "perl" es un archivo ejecutable en su ruta (o un alias de shell) que NO es realmente un programa de intérprete de Perl, se ejecutará en su lugar. Como ejemplo, intente esto en csh:
alias perl echo
which perl # Will print "perl: aliased to echo"
perl test.pl # Will print "test.pl". NOT what you intended!
unalias perl
Esto ejecutará su alias "perl" y simplemente hará eco de la palabra "prueba".pl "
Si" perl "es un ejecutable en su ruta que ES un intérprete de perl real, pasará" test.pl "como primer parámetro. En ese caso, el intérprete de Perl tratará este parámetro (como no comienza con un "-") como el nombre de un archivo que contiene código Perl para ejecutar e intentar leer el archivo, compilarlo como código Perl y ejecutarlo.
Tenga en cuenta que, dado que el programa que se ejecuta en realidad es "perl" y "test.pl" es simplemente un archivo de texto que se lee en "test.pl" no necesita tener el permiso de "ejecutar" de archivos de Unix.
El segundo caso, Shell intentará encontrar un archivo llamado "test.pl" en su directorio actual , y - si existe Y es ejecutable - intente ejecutarlo como un programa.
Si el archivo no existe o si no se establece el bit de ejecución en él, la cáscara se cerrará con el "comando no encontrado" de error.
Si el archivo tiene el bit de ejecución establecido, el shell (o el cargador de proceso en el kernel de Unix) intentará ejecutarlo. Las reglas por las cuales Unix ejecuta un archivo ejecutable determinado se rigen por los primeros 2 bytes del archivo, también conocido como "número mágico".
Para una cobertura MUY buena en profundidad de cómo funcionan los números mágicos, vea la pregunta "How does the #! work?
" en SO.
En un caso especial donde el "número mágico" es "#!" (alias "shebang"), el cargador leerá la primera línea del archivo, y tratará el contenido de esa línea (sans los primeros 2 bytes) como un comando para ejecutar en lugar del archivo ejecutable dado; y anexe la ruta al archivo ejecutable como un parámetro más al comando que lee de la línea shebang. Como ejemplos:
si "test.pl" es un archivo de texto con una primera línea de #!/bin/sh -x
, el núcleo se ejecutará /bin/sh -x ./test.pl
.
si "test.pl" es un archivo de texto con una primera línea de #!/usr/bin/perl
, el núcleo se ejecutará /usr/bin/perl ./test.pl
.
si "test.pl" es un archivo de texto con una primera línea de #!perl
, el núcleo se ejecutará perl ./test.pl
.
si "test.pl" es un archivo de texto con una primera línea de my $var = 1;
(o cualquier otro primer byte de 2 bytes que no sepa qué hacer con), o saldrá un error o (al menos en RedHat Linux) pretenderá que hubo un shen de implícita #!/bin/sh
e intentará ejecutar el archivo como el script de Bourne Shell. Que por supuesto fallar ya que era el código Perl, no shell script de
prueba de Perl.pl
./test.pl
perl test.pl NO comprobará $ PATH. – DVK
Si u establezca los permisos de ejecución al archivo, a continuación, puede ejecutar el archivo por ./ o bien ejecutar utilizando filename.pl Perl
Por ejecutar conjunto de bits, que quiere decir los permisos, ¿verdad? –
@rad Sí, al configurarlo con el comando 'chmod'. – HonkyTonk
bien, gracias! –