Шебанг (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, если он был установлен не администратором системы.

См. также

Напишите отзыв о статье "Шебанг (Unix)"

Примечания

  1. [tldp.org/LDP/abs/html/sha-bang.html Advanced Bash Scripting Guide]. Проверено 19 января 2012.
  2. 1 2 3 4 [www.in-ulm.de/~mascheck/various/shebang/ The #! magic, details about the shebang/hash-bang mechanism]. Проверено 19 января 2012.
  3. Cooper Mendel. [books.google.com/books?id=WPXkgFRd4OEC&lpg=PA5&dq=sha-bang&pg=PA5#v=onepage&q=sha-bang&f=false Advanced Bash Scripting Guide 5.3 Volume 1]. — lulu.com. — P. 5. — ISBN 978-1-4357-5218-4.
  4. MacDonald Matthew. [books.google.com/books?id=SR7HXy2XvBEC&pg=PA373 HTML5: The Missing Manual]. — Sebastopol, California: O'Reilly Media, 2011. — P. 373. — ISBN 978-1-4493-0239-9.
  5. Lutz Mark. [books.google.com/books?id=1HxWGezDZcgC&pg=PA48 Learning Python]. — 4th. — O'Reilly Media. — P. 48. — ISBN 978-0-596-15806-4.
  6. Lie Hetland Magnus. [books.google.co.uk/books?id=S0l1YFpRFVAC&lpg=PA21&dq=pound%20bang&pg=PA21#v=onepage&q=pound%20bang&f=false Beginning Python: From Novice to Professional]. — Apress. — P. 21. — ISBN 978-1-59059-519-0.
  7. Schitka John. [books.google.co.uk/books?id=l7JhL9rJLEgC&lpg=PA353&dq=hashpling&pg=PA353#v=onepage&q=hashpling&f=false Linux+ Guide to Linux Certification]. — Course Technology. — P. 353. — ISBN 978-0-619-13004-6.
  8. 1 2 [linux.die.net/man/2/execve execve(2) - Linux man page]. Проверено 21 октября 2010.
  9. [srfi.schemers.org/srfi-22/ SRFI 22]
  10. [wiki.freepascal.org/InstantFPC InstantFPC documentation]

Ссылки

  • [www.in-ulm.de/~mascheck/various/shebang/ Details about the shebang mechanism on various Unix flavours]
  • [homepages.cwi.nl/~aeb/std/hashexclam.html #! - the Unix truth as far as I know it] (a more generic approach)
  • [foldoc.org/shebang FOLDOC shebang article]

Отрывок, характеризующий Шебанг (Unix)

– Бе…се…е…ду…шка! – распевал пьяный мужик, счастливо улыбаясь и глядя на Ильина, разговаривающего с девушкой. Вслед за Дуняшей подошел к Ростову Алпатыч, еще издали сняв свою шляпу.
– Осмелюсь обеспокоить, ваше благородие, – сказал он с почтительностью, но с относительным пренебрежением к юности этого офицера и заложив руку за пазуху. – Моя госпожа, дочь скончавшегося сего пятнадцатого числа генерал аншефа князя Николая Андреевича Болконского, находясь в затруднении по случаю невежества этих лиц, – он указал на мужиков, – просит вас пожаловать… не угодно ли будет, – с грустной улыбкой сказал Алпатыч, – отъехать несколько, а то не так удобно при… – Алпатыч указал на двух мужиков, которые сзади так и носились около него, как слепни около лошади.
– А!.. Алпатыч… А? Яков Алпатыч!.. Важно! прости ради Христа. Важно! А?.. – говорили мужики, радостно улыбаясь ему. Ростов посмотрел на пьяных стариков и улыбнулся.
– Или, может, это утешает ваше сиятельство? – сказал Яков Алпатыч с степенным видом, не заложенной за пазуху рукой указывая на стариков.
– Нет, тут утешенья мало, – сказал Ростов и отъехал. – В чем дело? – спросил он.
– Осмелюсь доложить вашему сиятельству, что грубый народ здешний не желает выпустить госпожу из имения и угрожает отпречь лошадей, так что с утра все уложено и ее сиятельство не могут выехать.
– Не может быть! – вскрикнул Ростов.
– Имею честь докладывать вам сущую правду, – повторил Алпатыч.
Ростов слез с лошади и, передав ее вестовому, пошел с Алпатычем к дому, расспрашивая его о подробностях дела. Действительно, вчерашнее предложение княжны мужикам хлеба, ее объяснение с Дроном и с сходкою так испортили дело, что Дрон окончательно сдал ключи, присоединился к мужикам и не являлся по требованию Алпатыча и что поутру, когда княжна велела закладывать, чтобы ехать, мужики вышли большой толпой к амбару и выслали сказать, что они не выпустят княжны из деревни, что есть приказ, чтобы не вывозиться, и они выпрягут лошадей. Алпатыч выходил к ним, усовещивая их, но ему отвечали (больше всех говорил Карп; Дрон не показывался из толпы), что княжну нельзя выпустить, что на то приказ есть; а что пускай княжна остается, и они по старому будут служить ей и во всем повиноваться.
В ту минуту, когда Ростов и Ильин проскакали по дороге, княжна Марья, несмотря на отговариванье Алпатыча, няни и девушек, велела закладывать и хотела ехать; но, увидав проскакавших кавалеристов, их приняли за французов, кучера разбежались, и в доме поднялся плач женщин.
– Батюшка! отец родной! бог тебя послал, – говорили умиленные голоса, в то время как Ростов проходил через переднюю.
Княжна Марья, потерянная и бессильная, сидела в зале, в то время как к ней ввели Ростова. Она не понимала, кто он, и зачем он, и что с нею будет. Увидав его русское лицо и по входу его и первым сказанным словам признав его за человека своего круга, она взглянула на него своим глубоким и лучистым взглядом и начала говорить обрывавшимся и дрожавшим от волнения голосом. Ростову тотчас же представилось что то романическое в этой встрече. «Беззащитная, убитая горем девушка, одна, оставленная на произвол грубых, бунтующих мужиков! И какая то странная судьба натолкнула меня сюда! – думал Ростов, слушяя ее и глядя на нее. – И какая кротость, благородство в ее чертах и в выражении! – думал он, слушая ее робкий рассказ.
Когда она заговорила о том, что все это случилось на другой день после похорон отца, ее голос задрожал. Она отвернулась и потом, как бы боясь, чтобы Ростов не принял ее слова за желание разжалобить его, вопросительно испуганно взглянула на него. У Ростова слезы стояли в глазах. Княжна Марья заметила это и благодарно посмотрела на Ростова тем своим лучистым взглядом, который заставлял забывать некрасивость ее лица.
– Не могу выразить, княжна, как я счастлив тем, что я случайно заехал сюда и буду в состоянии показать вам свою готовность, – сказал Ростов, вставая. – Извольте ехать, и я отвечаю вам своей честью, что ни один человек не посмеет сделать вам неприятность, ежели вы мне только позволите конвоировать вас, – и, почтительно поклонившись, как кланяются дамам царской крови, он направился к двери.
Почтительностью своего тона Ростов как будто показывал, что, несмотря на то, что он за счастье бы счел свое знакомство с нею, он не хотел пользоваться случаем ее несчастия для сближения с нею.
Княжна Марья поняла и оценила этот тон.
– Я очень, очень благодарна вам, – сказала ему княжна по французски, – но надеюсь, что все это было только недоразуменье и что никто не виноват в том. – Княжна вдруг заплакала. – Извините меня, – сказала она.
Ростов, нахмурившись, еще раз низко поклонился и вышел из комнаты.


– Ну что, мила? Нет, брат, розовая моя прелесть, и Дуняшей зовут… – Но, взглянув на лицо Ростова, Ильин замолк. Он видел, что его герой и командир находился совсем в другом строе мыслей.
Ростов злобно оглянулся на Ильина и, не отвечая ему, быстрыми шагами направился к деревне.
– Я им покажу, я им задам, разбойникам! – говорил он про себя.
Алпатыч плывущим шагом, чтобы только не бежать, рысью едва догнал Ростова.
– Какое решение изволили принять? – сказал он, догнав его.
Ростов остановился и, сжав кулаки, вдруг грозно подвинулся на Алпатыча.
– Решенье? Какое решенье? Старый хрыч! – крикнул он на него. – Ты чего смотрел? А? Мужики бунтуют, а ты не умеешь справиться? Ты сам изменник. Знаю я вас, шкуру спущу со всех… – И, как будто боясь растратить понапрасну запас своей горячности, он оставил Алпатыча и быстро пошел вперед. Алпатыч, подавив чувство оскорбления, плывущим шагом поспевал за Ростовым и продолжал сообщать ему свои соображения. Он говорил, что мужики находились в закоснелости, что в настоящую минуту было неблагоразумно противуборствовать им, не имея военной команды, что не лучше ли бы было послать прежде за командой.
– Я им дам воинскую команду… Я их попротивоборствую, – бессмысленно приговаривал Николай, задыхаясь от неразумной животной злобы и потребности излить эту злобу. Не соображая того, что будет делать, бессознательно, быстрым, решительным шагом он подвигался к толпе. И чем ближе он подвигался к ней, тем больше чувствовал Алпатыч, что неблагоразумный поступок его может произвести хорошие результаты. То же чувствовали и мужики толпы, глядя на его быструю и твердую походку и решительное, нахмуренное лицо.