[E] l comportamiento parece coherente entre todos los shells de denuncia POSIX. No veo la necesidad de la necesidad de margen de maniobra aquí.
No estás mirando lo suficientemente profundo.
En la década de 1980, este mecanismo fue no estandarizado de facto. Aunque Dennis Ritchie lo había implementado, esa implementación no había llegado al público en el lado AT&T del universo. Efectivamente, solo estaba disponible públicamente y se conocía en BSD; con scripts de shell ejecutables no disponibles en AT&T Unix. Por lo tanto, no era razonable estandarizarlo. El estado de cosas está ejemplificado por este doco contemporáneo, uno de muchos de ellos:
Tenga en cuenta que BSD permite que los archivos que comienzan #! interpreter
se ejecuten directamente, mientras que SysV permite que solo se ejecuten directamente los archivos a.out. Esto significa que una instancia de una de las exec…()
rutinas en un programa BSD puede tener que cambiarse bajo SysV para ejecutar el intérprete (típicamente/bin/sh
) para ese programa.
- Stephen Frede (1988). "Programación en el sistema X Release Y". Boletín del grupo de usuarios de Australia Unix Systems . Volumen 9. Número 4. p. 111)
Un punto importante aquí es que está mirando shells, mientras que la existencia de scripts de shell ejecutables es realmente un asunto de las exec…()
funciones. Lo que hacen los shells incluye los precursores del mecanismo de script ejecutable, que todavía se encuentra en algunos shells aún hoy (y también hoy en día es obligatorio para el exec…p()
subconjunto de funciones), y es algo engañoso. Lo que el estándar debe abordar a este respecto es cómo funciona exec…()
un script interpretado, y en el momento en que POSIX se creó originalmente , simplemente no funcionó en primer lugar en una parte importante del espectro de los sistemas operativos de destino .
Una pregunta subordinada es por qué esto no se ha estandarizado desde entonces, especialmente porque el mecanismo del número mágico para los intérpretes de guiones había llegado al público en el lado AT&T del universo y se había documentado exec…()
en la Definición de interfaz del Sistema 5 , a fines de la década de 1990 :
Un archivo de intérprete comienza con una línea del formulario.#! nombre de ruta [arg]
donde pathname es la ruta del intérprete y arg es un argumento opcional. Cuando se exec
trata de un archivo de intérprete, el sistema exec
es el intérprete especificado.
- exec
. Definición V System Interface . Volumen 1. 1991.
Desafortunadamente, el comportamiento sigue siendo hoy casi tan divergente como lo era en la década de 1980 y no hay un comportamiento verdaderamente común para estandarizar. Algunos Unices (famosos HP-UX y FreeBSD, por ejemplo) no admiten scripts como intérpretes para scripts. Si la primera línea es uno, dos o muchos elementos separados por espacios en blanco varía entre MacOS (y las versiones de FreeBSD anteriores a 2005) y otros. La longitud máxima de ruta admitida varía. ␀
y los caracteres que se encuentran fuera del juego de caracteres de nombre de archivo portátil POSIX son complicados, al igual que los espacios en blanco iniciales y finales. Lo que terminan siendo el 0º, 1º y 2º argumento también es complicado, con una variación significativa entre los sistemas. Algunos actualmente son compatibles con POSIX pero no-Los sistemas Unix todavía no admiten ningún mecanismo de este tipo, y su mandato los convertiría en no más compatibles con POSIX.
Otras lecturas