Perl: Шебанг (пробел?) "#!"?

Я видел оба:

#!/path/...
#! /path/...

Какое право? Это имеет значение? Есть ли история?

Я слышал, что в древней версии Unix не было места. Но потом я услышал, что это всего лишь слух. Кто-нибудь знает наверняка?


Изменить: Я не мог подумать, где лучше спросить об этом. Это связано с программированием, поскольку пространство может заставить программу работать по-другому, насколько я знаю. Поэтому я спросил его здесь.

Ответ 1

У меня также есть смутное воспоминание о том, что пробелы в некоторых старых Unix-подобных системах запрещены, но некоторые исследования не подтверждают это.

Согласно этой статье в Википедии, синтаксис #! был введен в Версии 8 Unix в январе 1980 года. Первоначальное объявление этой функции Денисом Ритчи гласит:

Система была изменена так, что если запускается исполняемый файл с магическими символами #!, остальная часть строки понимается как быть именем интерпретатора для исполняемого файла. Ранее (и фактически все еще) раковина сделала большую часть этой работы; это автоматически выполняется сам по себе в текстовом файле с режимом выполнения, когда текст имя файла было введено как команда. Помещение объекта в Система дает следующие преимущества.

[СНиП]

Чтобы воспользоваться этой замечательной возможностью, поставьте

#! /bin/sh

в левом поле первой строки ваших сценариев оболочки. Пробелы после ! все в порядке. Используйте полный путь (без поиска). На момент, когда вся строка ограничена 16 символами, но это ограничение будет поднят.

Можно предположить, что некоторые более поздние Unix-подобные системы поддерживали синтаксис #!, но не допускали пропусков после !, но, учитывая, что самая первая реализация явно допускала пропуски, это кажется маловероятным.

Ответ leonbloy предоставляет больше контекста.

ОБНОВЛЕНИЕ:

Сам интерпретатор Perl распознает строку, начинающуюся с #!, даже в системах, где это не распознается ядром. Запустите perldoc perlrun или посмотрите эту веб-страницу для получения подробной информации.

# линия всегда проверяется на наличие переключателей, так как линия разобран. Таким образом, если вы находитесь на машине, которая допускает только один аргумент С#! линия или, что еще хуже, даже не распознает #! линия, ты все еще может получить согласованное поведение переключателя независимо от того, как Perl был вызывается, даже если -x использовался для поиска начала программы.

Perl также разрешает пробелы после #!.

(Лично я предпочитаю писать строку #! без пробелов, но она будет работать в любом случае.)

И ответ leonjoy указывает на эту веб-страницу Свена Машика, в которой рассказывается об истории #! в глубине. (Я упоминаю об этом сейчас из-за недавнего обсуждения comp.unix.shell.)

Ответ 2

Кажется, что обычно работают в обоих направлениях. См. здесь. Я бы сказал, что безпространственная версия сегодня намного более распространена, и, для меня, гораздо более привлекательной.

Кстати, это не связано конкретно с Perl (но это определенно связано с программированием).