[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: /bin/bash en archivos ejecutables



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


Reply to: