On Wed, Jun 14, 2006 at 03:29:43AM +0000, Andrés M. wrote:
> Alguien sabe la diferencia entre poner o no al comienzo de un script en
> bash:
> #!/bin/bash ?????
>
> Me dijeron que tiene que ver con cómo lo interpreta el kernel, pero la
> verdad es que no lo encontré en ningún lado.
Cuando tratas de ejecutar un archivo el kernel hace lo que sigue[1]:
- Verificar, por supuesto, que tengas permiso de ejecución :-)
- Lee el principio del archivo. Según esos primeros bytes, decide que
el archivo es de un cierto tipo y lo ejecuta con las rutinas para ese
tipo. En particular, si los primeros dos bytes son #! usa el resto de
la linea como el nombre del interprete para dicho archivo y ejecuta
*eso* con el nombre del archivo como primer argumento
- Si ninguno de los 'filtros' registrados en el kernel identifica el
archivo, lo ejecuta con /bin/sh (que en un Debian normal es un vínculo
a /bin/bash)
Entonces:
Si tu archivo se llama /home/yo/mi-script
- Si es un binario, el kernel lo ejecuta directamente
- Si empieza con #!/usr/bin/mi-super-lenguaje, el kernel ejecuta
/usr/bin/mi-super-lenguaje /home/yo/mi-script
(Caso particular. Si empieza con #!/usr/bin/mi-super-lenguaje --opcion
se ejectuta
#!/usr/bin/mi-super-lenguaje --opcion /home/yo/mi-script
)
- En otro caso, se ejecuta
/bin/sh /home/yo/mi-script
¿Qué diferencia hace, te preguntas, si en mi bonito Debian /bin/sh es
un vínculo a /bin/bash?
1. Si pones el #!/bin/bash te aseguras de que se ejecute con bash aún
en sistemas dónde el administrador ha decidido cambiar /bin/sh a
apuntar a /bin/ksh, por ejemplo.
2. Si bash es llamado con el nombre 'sh' su comportamiento cambia y
prende las opciones de compatibilidad POSIX. O sea que si tu script
depende de caracteristicas especiales de bash no va a funcionar.
3. Si te acostumbras a poner la linea mágica te ries más cuando ves
a Gunnar (o a tu hacker de cabecera local) con una camiseta que dice
hash
bang
slash
bin
slash
bash
:D
[1] Ruego encarecidamente a los gurus locales perdonen la
simplificación de tantos y tan bonitos detalles sutiles.
--
Rodrigo Gallardo PGP Key ID: ADC9BC28
Fingerprint: 7C81 E60C 442E 8FBC D975 2F49 0199 8318 ADC9 BC28
http://www.nul-unu.com http://www.nul-unu.com/blogs/elucubrando
Attachment:
signature.asc
Description: Digital signature