Introducción
Originalmente, sólo había un intérprete de comandos en Unix. Cuando se llevó a cabo un comando, el shell intentará acogerse a alguno de la familia exec () las llamadas al sistema sobre el mismo. Si el comando es un ejecutable, que el éxito y ejecutar el comando se ejecute. Si la familia exec () no, el depósito no se dan por vencidos, sino que trataría de interpretar el archivo de comandos como si se tratara de un script de shell. Esto funciona correctamente siempre y cuando sólo hay un intérprete de comandos en el sistema. Pero lo que si está usando un shell como su interactivo y desea ejecutar un script escrito en otro idioma del shell?
Aquí es donde el #! truco viene pulg La idea de utilizar # para representar un comentario con su origen y fue rápidamente csh añadido a la bourne shell. Ahora todos los depósitos saber hacer caso omiso de cosas después de un #. Por lo tanto, podemos añadir una línea algo así como "#! / Usr / bin / ksh". Para el depósito de esta línea es sólo un comentario. Pero si el núcleo intenta ejecutar un archivo con esta línea, se especifica el intérprete exec y pasar el script a la misma. Así que los scripts de shell ejecutable convertido casi como reales son ejecutables. Ahora, cuando un shell intenta ejecutar un script de shell, tiene éxito.
¿Qué sucede si usted sale fuera de la #! línea? Así, el núcleo exec fallará. Su promedio de shell ahora intenta ejecutar el script en sí. A pocos depósitos intentará inspeccionar el script para tratar de adivinar el idioma. Esto no es bueno. Puede estar ejecutando ksh como su intérprete de comandos interactivo ksh y escribir guiones. Si más adelante cambiar a bash como un intérprete de comandos interactivo, algunas de sus secuencias pueden continuar a correr, mientras que otros pueden fallar. También la línea
es un comentario que constituye una importante pista a un programador que se ve en la secuencia de comandos para su comprensión. Conocer la lengua en la que el autor está tratando de usar es una gran ayuda.
Si bien he utilizado el término "depósito", en realidad esta técnica se puede utilizar con muchos programas que no son los depósitos. Aquí es un "script" para mostrar un mensaje multilínea:
Código:
#! /usr/bin/cat
Line 1
Line 2
Line 3
Esto mostrará que "#! / Usr / bin / cat" la línea, pero que no sea, funciona bastante bien.
La superación de un argumento
Usted puede pasar un solo argumento como este:
#! / usr / local / bin /
perl -w
Pero, en general, se limitan a
uno argumento. En la mayoría de los sistemas, una línea como: "#! / Algunos / intérprete-una-b" se traducirá en "-a-b" se pasa como único argumento. Sin embargo, el único argumento no se limita a partir de un guión. Podemos mejorar en nuestro mensaje de secuencia de comandos:
Código:
#! /usr/bin/sed 1d
Line 1
Line 2
Line 3
Ejemplo
Vamos a poner todo esto junto con un ejemplo. Aquí hay una
perl script que se llame perlargs:
Código:
#! /usr/local/bin/perl -w
#! /usr/local/bin/perl -w
print "script name is ", $0, "\n";
while (@ARGV) {
$ARGV = shift @ARGV;
print "argument ", $i++, " is ", $ARGV, "\n";
}
system "ps -f -ww";
La pregunta-w
perl cuestión de los mensajes de advertencia. El script simplemente muestra sus argumentos, luego ejecuta el comando ps. Cuando se ejecuta, me sale:
Código:
$ ./perlargs one two three
Name "main::i" used only once: possible typo at ./perlargs line 10.
script name is ./perlargs
argument 0 is one
argument 1 is two
argument 2 is three
UID PID PPID STIME TTY TIME CMD
perderabo 69 1 17:47:28 n01 0:00.24 /bin/ksh -l
perderabo 201 69 18:28:22 n01 0:00.03 /usr/local/bin/perl -w ./perlargs one two three
perderabo 2055 201 18:28:22 n01 0:00.01 ps -f -ww
$
Observe que el
perl Se abre el proceso con 5 argumentos. El 2 º argumento es el nombre del script. Corresponde a la
perl proceso para presentar los últimos 3 argumentos como la lista de argumentos visto por la secuencia de comandos. También comenzó a hacer realidad el núcleo de la
perl proceso. Después de eso, corresponde a
perl la secuencia de comandos para abrir y leer y ejecutar cada línea. Por esta razón, los scripts tienen que ser legible. No se puede ejecutar un script de no-lectura.
Conclusión
Esto debería ser suficiente información para comprender lo que está sucediendo con los #! líneas. En los siguientes puestos, voy a añadir más detalles sobre diversos aspectos del proceso.