[D] Das Verhalten scheint zwischen allen POSIX-Beschwerdeshells konsistent zu sein. Ich sehe hier keine Notwendigkeit für Spielraum.
Du schaust nicht tief genug.
In den 1980er Jahren war dieser Mechanismus nicht de facto standardisiert. Obwohl Dennis Ritchie es implementiert hatte, hatte diese Implementierung die Öffentlichkeit auf der AT & T-Seite des Universums nicht erreicht. Es war praktisch nur öffentlich verfügbar und in BSD bekannt; mit ausführbaren Shell-Skripten, die unter AT & T Unix nicht verfügbar sind. Daher war es nicht sinnvoll, es zu standardisieren. Der Stand der Dinge wird durch dieses zeitgenössische Dokument veranschaulicht, eines von vielen solchen:
Beachten Sie, dass BSD die #! interpreter
direkte Ausführung von Dateien zulässt, während SysV nur die direkte Ausführung von a.out-Dateien zulässt. Dies bedeutet, dass eine Instanz einer der exec…()
Routinen in einem BSD-Programm möglicherweise unter SysV geändert werden muss, um den Interpreter auszuführen (typlisch)/bin/sh
stattdessen ) für dieses Programm .
- Stephen Frede (1988). "Programmieren auf System X Release Y". Australischer Newsletter der Unix Systems User Group . Band 9. Nummer 4. p. 111.
Ein wichtiger Punkt hierbei ist, dass Sie sich mit Shells befassen, wohingegen die Existenz von ausführbaren Shell-Skripten tatsächlich eine Frage der exec…()
Funktionen ist. Was Shells tun, schließt die Vorläufer des ausführbaren Skriptmechanismus ein, der auch heute noch in einigen Shells zu finden ist (und auch heutzutage für die exec…p()
Untermenge von Funktionen vorgeschrieben ist), und ist etwas irreführend. Was der Standard in dieser Hinsicht berücksichtigen muss, ist die Funktionsweise exec…()
eines interpretierten Skripts, und zu der Zeit, als POSIX ursprünglich erstellt wurde , funktionierte es in einem Großteil des Spektrums der Zielbetriebssysteme überhaupt nicht .
Eine untergeordnete Frage ist , warum ist dies , da nicht standardisiert worden, zumal der magische Zahl Mechanismus für die Skript - Interpreter hatte die Öffentlichkeit in der AT & T - Seite des Universums erreicht und hatte dokumentiert exec…()
in dem System 5 Interface Definition , durch die Wende der 1990er Jahre :
Eine Interpreterdatei beginnt mit einer Zeile des Formulars#! Pfadname [arg]
Dabei ist Pfadname der Pfad des Interpreters und arg ein optionales Argument. Wenn Sie exec
eine Interpreter-Datei, das Systemexec
der angegebene Interpreter.
- exec
. System V-Schnittstellendefinition . Band 1. 1991.
Leider ist das Verhalten heute fast so unterschiedlich wie in den 1980er Jahren, und es gibt kein wirklich verbreitetes Verhalten, das standardisiert werden könnte. Einige Unices (beispielsweise HP-UX und FreeBSD) unterstützen keine Skripte als Interpreter für Skripte. Ob es sich bei der ersten Zeile um ein, zwei oder viele durch Leerzeichen getrennte Elemente handelt, hängt von MacOS (und Versionen von FreeBSD vor 2005) und anderen ab. Die maximal unterstützte Pfadlänge variiert. ␀
und Zeichen außerhalb des POSIX-Zeichensatzes für portable Dateinamen sind ebenso schwierig wie führende und nachfolgende Leerzeichen. Was das 0., 1. und 2. Argument ist, ist ebenfalls schwierig, mit erheblichen Abweichungen zwischen den Systemen. Einige derzeit POSIX-konforme aber nicht-Unix-Systeme unterstützen solche Mechanismen immer noch nicht, und wenn dies vorgeschrieben ist, werden sie nicht mehr POSIX-konform.
Weitere Lektüre