Шебанг (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, используя переменную среды для получения пути к файлу интерпретатора.

Строки с шебангом могут содержать дополнительные аргументы, которые передаются интерпретатору (см. пример для 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, если он был установлен не администратором системы.

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

  1. Advanced Bash Scripting Guide. Проверено 19 января 2012.
  2. 1 2 3 4 The #! magic, details about the shebang/hash-bang mechanism. Проверено 19 января 2012.
  3. Cooper Mendel. Advanced Bash Scripting Guide 5.3 Volume 1. — lulu.com. — P. 5. — ISBN 978-1-4357-5218-4.
  4. MacDonald Matthew. HTML5: The Missing Manual. — Sebastopol, California: O'Reilly Media, 2011. — P. 373. — ISBN 978-1-4493-0239-9.
  5. Lutz Mark. Learning Python. — 4th. — O'Reilly Media. — P. 48. — ISBN 978-0-596-15806-4.
  6. Lie Hetland Magnus. Beginning Python: From Novice to Professional. — Apress. — P. 21. — ISBN 978-1-59059-519-0.
  7. Schitka John. Linux+ Guide to Linux Certification. — Course Technology. — P. 353. — ISBN 978-0-619-13004-6.
  8. 1 2 execve(2) - Linux man page. Проверено 21 октября 2010.
  9. SRFI 22
  10. InstantFPC documentation

Ссылки[править | править вики-текст]