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