Введение

Символ "#! ", используемый в вычислительной технике

В вычислительной технике shebang — это последовательность символов, состоящая из символов решётки и восклицательного знака в начале скрипта. Его также называют "sharp exclamation", "sha bang", "hashbang", "pound bang" или "hash pling". Когда текстовый файл с shebang используется как исполняемый файл в Unix-подобной операционной системе, механизм загрузки программы разбирает остальную часть первой строки файла как директиву интерпретатора. Загрузчик выполняет указанную программу-интерпретатор, передавая ей в качестве аргумента путь, который был первоначально использован при попытке запуска скрипта, чтобы программа могла использовать файл в качестве входных данных. Например, если скрипт имеет путь path/to/script и начинается со строки #!/bin/sh, то загрузчик программы получает инструкцию запустить программу /bin/sh, передавая path/to/script в качестве первого аргумента. Строка shebang обычно игнорируется интерпретатором, поскольку символ "#" является маркером комментария во многих языках сценариев; некоторые интерпретаторы языков, которые не используют решётку для начала комментариев, всё равно могут игнорировать строку shebang, учитывая её назначение.

Сильные стороны

По сравнению с использованием глобальных списков ассоциаций между расширениями файлов и приложениями, выполняющими их интерпретацию, метод директивы интерпретатора позволяет пользователям использовать интерпретаторы, не зарегистрированные на уровне всей системы, и без прав администратора. Он также обеспечивает возможность выбора конкретного интерпретатора, не перегружая пространство имен расширений файлов (когда одно расширение файла связано с несколькими типами файлов), и позволяет изменить язык реализации скрипта, не меняя синтаксис его вызова из других программ. Программы, запускающие скрипт, не должны знать, на каком языке он реализован, поскольку сам скрипт отвечает за указание используемого интерпретатора.

Магическое число

Шебанг — это, по сути, удобочитаемое человеком представление магического числа в исполняемом файле, магическая байтовая строка которого — , два символа, кодирующие в ASCII. Это магическое число обнаруживается семейством функций "exec", которые определяют, является ли файл скриптом или исполняемым двоичным файлом. Наличие шебанга приводит к выполнению указанного исполняемого файла, как правило, интерпретатора для языка скрипта. Утверждалось, что некоторые старые версии Unix ожидают, что за обычным шебангом следует пробел и косая черта , но, по-видимому, это не так;

Этимология

Исполняемый файл, начинающийся с директивы интерпретатора, обычно называют скриптом, часто с указанием имени или общей категории используемого интерпретатора. Название "shebang" для этих двух характерных символов, возможно, произошло от неточного сокращения "SHArp bang" или "haSH bang", отсылающих к двум типичным названиям этих символов в Unix. Другая версия гласит, что "sh" в "shebang" происходит от стандартной оболочки sh, которая обычно вызывается с помощью shebang. Это употребление было зафиксировано к декабрю 1989 года и, вероятно, появилось раньше.

История

Шембанг был представлен Деннисом Ричи между седьмым и восьмым изданиями Unix в Bell Laboratories. Он также был добавлен в релизы BSD от Berkeley's Computer Science Research (присутствовал в 2.8BSD и активирован по умолчанию в 4.2BSD). Поскольку AT&T Bell Laboratories Edition 8 Unix и последующие издания не были выпущены в открытый доступ, первое широкое распространение эта функция получила именно в BSD. Отсутствие директивы интерпретатора, но поддержка скриптов оболочки, заметно в документации к версии 7 Unix 1979 года, где вместо этого описывается механизм оболочки Bourne: файлы с правами на выполнение обрабатывались бы оболочкой особым образом, которая (в зависимости от начальных символов скрипта, например ":" или "#") запускала бы подпроцесс для интерпретации и выполнения содержащихся в файле команд. В этой модели скрипты вели себя как обычные команды только при вызове из оболочки Bourne. Попытка непосредственного запуска такого файла через системный вызов exec операционной системы завершалась бы неудачей, что не позволяло скриптам единообразно функционировать как стандартные системные команды.