Ubicación del programaEditar
Los Shebangs deben especificar rutas absolutas (o rutas relativas al directorio de trabajo actual) a los ejecutables del sistema; esto puede causar problemas en los sistemas que tienen una disposición del sistema de archivos no estándar. Incluso cuando los sistemas tienen rutas bastante estándar, es muy posible que las variantes del mismo sistema operativo tengan diferentes ubicaciones para el intérprete deseado. Python, por ejemplo, puede estar en /usr/bin/python3, /usr/local/bin/python3, o incluso algo como /home/nombredeusuario/bin/python3 si lo instala un usuario normal.
Un problema similar existe para el shell POSIX, ya que POSIX sólo requería que su nombre fuera sh, pero no ordenaba una ruta. Un valor común es /bin/sh, pero algunos sistemas como Solaris tienen el shell compatible con POSIX en /usr/xpg4/bin/sh. En muchos sistemas Linux, /bin/sh es un enlace duro o simbólico a /bin/bash, el shell Bourne Again (BASH). Usar la sintaxis específica de bash mientras se mantiene un shebang apuntando a sh tampoco es portable.
Debido a esto, a veces es necesario editar la línea del shebang después de copiar un script de un ordenador a otro porque la ruta que se codificó en el script puede no aplicarse en una nueva máquina, dependiendo de la consistencia en la convención pasada de colocación del intérprete. Por esta razón y porque POSIX no estandariza los nombres de las rutas, POSIX no estandariza la característica. La herramienta GNU Autoconf puede comprobar el soporte del sistema con la macro AC_SYS_INTERPRETER.
A menudo, el programa /usr/bin/env puede ser usado para sortear esta limitación introduciendo un nivel de indirección. #!
es seguido por /usr/bin/env, seguido por el comando deseado sin la ruta completa, como en este ejemplo:
#!/usr/bin/env sh
Esto funciona mayormente porque la ruta /usr/bin/env es comúnmente usada para la utilidad env, e invoca el primer sh encontrado en el $PATH del usuario, típicamente /bin/sh.
Esto todavía tiene algunos problemas de portabilidad con OpenServer 5.0.6 y Unicos 9.0.2 que sólo tienen /bin/env y no /usr/bin/env.
Interpretación de caracteresEditar
Otro problema de portabilidad es la interpretación de los argumentos de los comandos.Algunos sistemas, incluyendo Linux, no dividen los argumentos; por ejemplo, cuando se ejecuta el script con la primera línea como,
#!/usr/bin/env python3 -c
todo el texto después del primer espacio se trata como un solo argumento, es decir, python3 -c
se pasará como un solo argumento a /usr/bin/env, en lugar de dos argumentos. Cygwin también se comporta de esta manera.
Las invocaciones complejas al intérprete son posibles mediante el uso de una envoltura adicional. FreeBSD 6.0 (2005) introdujo una opción -S en su env al cambiar el comportamiento de lectura de shebang a no dividir. Esta opción le dice a env que divida la cadena por sí misma. La utilidad GNU env desde coreutil 8.30 (2018) también incluye esta característica. Aunque el uso de esta opción mitiga el problema de portabilidad en el extremo del kernel con la división, añade el requisito de que env soporte esta extensión particular.
Otro problema son los scripts que contienen un carácter de retorno de carro inmediatamente después de la línea shebang, quizás como resultado de haber sido editados en un sistema que utiliza saltos de línea DOS, como Microsoft Windows. ¡Algunos sistemas interpretan el carácter de retorno de carro como parte del comando del intérprete, lo que resulta en un mensaje de error.
Número mágicoEditar
El shebang es en realidad una instancia legible para el ser humano de un número mágico en el archivo ejecutable, la cadena de bytes mágicos es 0x23 0x21, la codificación de dos caracteres en ASCII de #! Este número mágico es detectado por la familia de funciones «exec», que determinan si un archivo es un script o un binario ejecutable. La presencia del shebang dará lugar a la ejecución del ejecutable especificado, normalmente un intérprete para el lenguaje del script. Se ha afirmado que algunas versiones antiguas de Unix esperan que el shebang normal sea seguido por un espacio y una barra (#! /
), pero esto parece no ser cierto; más bien, los espacios en blanco después del shebang han sido tradicionalmente permitidos, y a veces documentados con un espacio (ver el correo electrónico de 1980 en la sección de historia más abajo).
Los caracteres shebang son representados por los mismos dos bytes en codificaciones ASCII extendidas, incluyendo UTF-8, que es comúnmente usado para scripts y otros archivos de texto en sistemas actuales tipo Unix. Sin embargo, los archivos UTF-8 pueden comenzar con la marca opcional de orden de bytes (BOM); si la función «exec» detecta específicamente los bytes 0x23 y 0x21, la presencia de la BOM (0xEF 0xBB 0xBF) antes del shebang impedirá la ejecución del intérprete del script. Algunas autoridades recomiendan no usar la marca de orden de bytes en scripts POSIX (tipo Unix), por esta razón y por preocupaciones filosóficas y de interoperabilidad más amplias. Además, una marca de orden de bytes no es necesaria en UTF-8, ya que esa codificación no tiene problemas de endogamia; sólo sirve para identificar la codificación como UTF-8.