[T] его поведение кажется согласованным между всеми оболочками жалоб POSIX. Я не вижу необходимости в комнате для маневра.
Вы не смотрите достаточно глубоко.
Еще в 1980 - х годах, этот механизм был не де - факто стандартизирован. Несмотря на то, что Деннис Ритчи это реализовал, эта реализация не достигла широкой публики в области AT & T во вселенной. Это было эффективно только публично доступно и известно в BSD; с исполняемыми сценариями оболочки, недоступными в AT & T Unix. Таким образом, было не разумно стандартизировать это. Положение вещей иллюстрируется этим современным документом, одним из многих таких:
Обратите внимание, что BSD позволяет #! interpreter
напрямую выполнять файлы, которые начинаются с , в то время как SysV позволяет напрямую выполнять только файлы .out. Это означает, что экземпляр одной из exec…()
подпрограмм в программе BSD, возможно, придется изменить в SysV, чтобы /bin/sh
вместо этого выполнить интерпретатор (типично ) для этой программы.
- Стивен Фреде (1988). "Программирование в System X Release Y". Австралийский Unix Systems User Group Информационный бюллетень . Том 9. Номер 4. с. 111.
Важным моментом здесь является то, что вы смотрите на оболочки, в то время как наличие исполняемых сценариев оболочки на самом деле exec…()
зависит от функций. То, что делают оболочки, включает в себя предшественники механизма исполняемых сценариев, которые все еще можно найти в некоторых оболочках даже сегодня (а также в настоящее время обязательные для exec…p()
подмножества функций), и это несколько вводит в заблуждение. В этом отношении стандарт должен учитывать то, как exec…()
работает интерпретируемый сценарий, и в то время, когда POSIX был изначально создан, он просто не работал в первую очередь в большей части спектра целевых операционных систем .
Подчиненный вопрос, почему это не было стандартизировано , так как, в частности , как механизм магического числа для сценария переводчиков был достигнута общественность в AT & T стороны Вселенной и был задокументирован для exec…()
в определении 5 Интерфейса системы , на рубеже 1990 - х лет :
Файл интерпретатора начинается со строки вида#! путь [arg]
где pathname - это путь интерпретатора, а arg - необязательный аргумент. Когда вы exec
используете файл интерпретатора, система exec
использует указанный интерпретатор.
- exec
. V Интерфейс Определение системы . Том 1. 1991.
К сожалению, поведение остается сегодня почти таким же широко расходящимся, как это было в 1980-х годах, и нет действительно распространенного поведения, которое можно стандартизировать. Некоторые Unices (например, HP-UX и FreeBSD, например) не поддерживают сценарии как интерпретаторы сценариев. То, является ли первая строка одним, двумя или многими элементами, разделенными пробелами, зависит от MacOS (и версий FreeBSD до 2005 года) и других. Максимальная поддерживаемая длина пути варьируется. ␀
и символы из набора символов переносимого имени файла POSIX являются хитрыми, как начальные и конечные пробелы. То, чем заканчиваются 0-й, 1-й и 2-й аргументы, тоже сложно, со значительными различиями в разных системах. Некоторые в настоящее время POSIX-совместимые, но не- Системы Unix по-прежнему не поддерживают ни один такой механизм, и его обязательное преобразование приведет к тому, что они перестанут быть POSIX-совместимыми.
дальнейшее чтение