[L] e comportement semble cohérent entre tous les obus à réclamation POSIX. Je ne vois pas le besoin de besoin de marge de manœuvre ici.
Vous ne regardez pas assez profondément.
Dans les années 80, ce mécanisme n'était pas de facto standardisé. Bien que Dennis Ritchie l'ait mise en œuvre, cette mise en œuvre n'avait pas atteint le public du côté AT&T de l'univers. Il n'était effectivement accessible au public et connu qu'en BSD; avec des scripts shell exécutables non disponibles sur AT&T Unix. Il n'était donc pas raisonnable de le normaliser. La situation est illustrée par ce doco contemporain, l'un des nombreux:
Notez que BSD permet aux fichiers qui commencent par #! interpreter
d'être exécutés directement, tandis que SysV permet uniquement aux fichiers a.out d'être exécutés directement. Cela signifie qu'une instance de l'une des exec…()
routines d'un programme BSD peut devoir être modifiée sous SysV pour exécuter l'interpréteur (typliquement /bin/sh
) pour ce programme à la place.
- Stephen Frede (1988). "Programmation sur System X Release Y". Bulletin d'information du groupe d'utilisateurs d'Unix Systems en Australie . Volume 9. Numéro 4. p. 111.
Un point important ici est que vous regardez les shells, alors que l'existence de scripts shell exécutables est en fait une question de exec…()
fonctions. Ce que font les shells comprend les précurseurs du mécanisme de script exécutable, qui se trouvent encore dans certains shells encore aujourd'hui (et également de nos jours obligatoires pour le exec…p()
sous - ensemble de fonctions), et est quelque peu trompeur. À cet égard, la norme doit aborder le fonctionnement exec…()
d'un script interprété, et au moment de la création de POSIX, il ne fonctionnait tout simplement pas en premier lieu sur une grande partie du spectre des systèmes d'exploitation cibles .
Une question secondaire est de savoir pourquoi cela n'a pas été normalisé depuis, d'autant plus que le mécanisme du nombre magique pour les interprètes de script avait atteint le public du côté AT&T de l'univers et avait été documenté exec…()
dans la définition d'interface du système 5 , au tournant des années 1990. :
Un fichier interprète commence par une ligne du formulaire#! chemin d'accès [arg]
où chemin est le chemin de l'interpréteur et arg est un argument facultatif. Lorsque vous exec
utilisez un fichier d'interpréteur, le système exec
est l'interpréteur spécifié.
- exec
. System V Interface Definition . Volume 1. 1991.
Malheureusement, le comportement reste aujourd'hui presque aussi largement différent qu'il l'était dans les années 80 et il n'y a pas de comportement vraiment commun à normaliser. Certains Unices (notamment HP-UX et FreeBSD, par exemple) ne prennent pas en charge les scripts comme interprètes de scripts. Que la première ligne soit un, deux ou plusieurs éléments séparés par des espaces varie entre MacOS (et les versions de FreeBSD avant 2005) et les autres. La longueur de chemin maximale prise en charge varie. ␀
et les caractères en dehors du jeu de caractères de nom de fichier portable POSIX sont délicats, tout comme les espaces de début et de fin. Ce que les 0e, 1er et 2e arguments finissent par être est également délicat, avec des variations importantes d'un système à l'autre. Certains sont actuellement conformes à POSIX mais non-Les systèmes Unix ne prennent toujours pas en charge un tel mécanisme, et le rendre obligatoire les convertirait en n'étant plus conforme à POSIX.
Lectures complémentaires