Шебанг (Unix)

Шебанг — последовательность символов

Шебанг  (англ. shebang, sha-bang,[1][2][3] hashbang,[4][5] pound-bang,[2][6] or hash-pling[2][7]) — в программировании последовательность из символов решётки и восклицательного знака ("#!") в начале файла скрипта.

Когда скрипт с шебангом выполняется как программа в Unix-подобных операционных системах, загрузчик программ рассматривает остаток строки после шебанга как имя файла программы-интерпретатора. Загрузчик запускает эту программу и передаёт ей в качестве параметра имя файла скрипта с шебангом.[8] Например, если полное имя файла скрипта "path/to/script" и первая строка этого файла:

#!/bin/sh

то загрузчик запускает на выполнение "/bin/sh" (обычно это Bourne shell или совместимый интерпретатор командной строки) и передаёт "path/to/script" как первый параметр.

Строка с шебангом обычно пропускается интерпретатором, так как символ "#" является символом начала комментариев во многих скриптовых языках. Некоторые интерпретаторы, которые не используют символ решётки для обозначения начала комментариев (такие, как Scheme), могут пропустить строку шебанга, определив её назначение.[9] Другие решения полагаются на препроцессор, который обрабатывает и удаляет строку шебанга перед тем, как остальная часть скрипта передаётся компилятору или интерпретатору. Так, например, работает InstantFPC, который позволяет запускать программы, написанные на Free Pascal, как скрипты на некоторых операционных системах.[10]

Строка шебанга имеет следующий формат:[8]

#!interpreter [optional-arg]

interpreter должен быть абсолютным путём к исполняемому[1] файлу программы (если интерпретатором является скрипт, он тоже должен начинаться с шебанга). Необязательный optional‑arg должен иметь формат единственного аргумента (по причинам переносимости он не должен содержать пробелы). Пробел после #! является опциональным.[2]

Несколько типичных строк с шебангом:

  • #!/bin/sh — выполнить файл с помощью sh (Bourne shell) или другой совместимой оболочки;
  • #!/bin/csh -f — выполнить файл с помощью csh (C shell) или другой совместимой оболочки, с отключением выполнения .cshrc файла пользователя;
  • #!/usr/bin/perl -T — выполнить файл при помощи Perl в режиме Taint checking;
  • #!/usr/bin/env python2 — выполнить файл как программу на Python, используя env для получения пути к файлу интерпретатора.

Строки с шебангом могут содержать дополнительные аргументы, которые передаются интерпретатору (см. пример для Perl выше). Однако, так как обработка аргументов может различаться, для переносимости лучше использовать только один аргумент без пробелов внутри. Дальнейшие указания по переносимости даны ниже.

Назначение

[править | править код]

Указание интерпретатора в строке шебанга позволяет использовать файлы скриптов и данных как системные команды, скрывая детали реализации от пользователей и других программ, так как устраняется необходимость указывать файл интерпретатора в командной строке перед файлом скрипта.

Предположим, скрипт для Bourne shell находится в файле "some/path/to/foo", первая строка которого равна

#!/bin/sh -x 

Если пользователь попытается выполнить этот файл скрипта при помощи командной строки (указывая "bar" и "baz" как аргументы)

some/path/to/foo bar baz 

то результат будет таким же, как выполнение команды:

/bin/sh -x some/path/to/foo bar baz 

Если путь "/bin/sh" является программой интерпретатора Bourne shell, то в результате "bar" и "baz" будут присвоены позиционным параметрам $1 и $2 интерпретатора, а все строки файла "some/path/to/foo" будут выполнены как команды этого интерпретатора. Также, поскольку символ решётки является символом начала комментария в языке Bourne shell (и во многих других интерпретаторах), строка шебанга будет пропущена.

Однако, только самим интерпретатором определяется итоговая обработка строки шебанга. Так, скрипт, содержащий следующие две строки, просто выведет обе строки в стандартный поток вывода:

#!/bin/cat Hello world! 

Преимущества

[править | править код]

По сравнению с использованием глобального сопоставления расширения файла приложению интерпретатора, указание строки вызова интерпретатора в шебанге позволяет задать интерпретатор, неизвестный на глобальном уровне, и не требует прав администратора системы. Шебанг также позволяет задавать интерпретатор индивидуально для файла, не вводя сложной концепции пространства имён для сопоставления одного расширения нескольким интерпретаторам.

Переносимость

[править | править код]

Шебанг должен задавать абсолютный путь (или путь относительно текущего рабочего каталога) для выполняемых файлов. Это может привести к проблемам для систем с нестандартной структурой файловой системы. Даже для систем с довольно стандартными каталогами, вполне возможно, что варианты одной и той же операционной системы хранят нужный интерпретатор в разных местах. Python, например, может быть в /usr/bin/python, /usr/local/bin/python, или, даже, в /home/username/bin/python, если он был установлен не администратором системы.

Поэтому для лучшей переносимости используют /usr/bin/env, обладающий возможностью поиска программы в PATH, например:

#!/usr/bin/env python 

В данном случае, где бы ни находился интерпретатор Python, он будет запущен.

Примечания

[править | править код]
  1. Advanced Bash Scripting Guide. Дата обращения: 19 января 2012. Архивировано 10 декабря 2019 года.
  2. 1 2 3 4 The #! magic, details about the shebang/hash-bang mechanism. Дата обращения: 19 января 2012. Архивировано 25 мая 2011 года.
  3. Cooper, Mendel. Advanced Bash Scripting Guide 5.3 Volume 1 (англ.). — lulu.com, 2010. — P. 5. — ISBN 978-1-4357-5218-4.
  4. MacDonald, Matthew. HTML5: The Missing Manual (неопр.). — Sebastopol, California: O’Reilly Media, 2011. — С. 373. — ISBN 978-1-4493-0239-9.
  5. Lutz, Mark. Learning Python (неопр.). — 4th. — O’Reilly Media, 2009. — С. 48. — ISBN 978-0-596-15806-4.
  6. Lie Hetland, Magnus. Beginning Python: From Novice to Professional (англ.). — Apress, 2005. — P. 21. — ISBN 978-1-59059-519-0.
  7. Schitka, John. Linux+ Guide to Linux Certification (неопр.). — Course Technology[англ.], 2002. — С. 353. — ISBN 978-0-619-13004-6.
  8. 1 2 execve(2) - Linux man page. Дата обращения: 21 октября 2010. Архивировано 2 ноября 2010 года.
  9. SRFI 22. Дата обращения: 20 сентября 2015. Архивировано 27 февраля 2011 года.
  10. InstantFPC documentation. Дата обращения: 15 ноября 2015. Архивировано 9 ноября 2015 года.