Shebang

Материал из Xgu.ru

Перейти к: навигация, поиск
перевод http://wiki.bash-hackers.org/scripting/basics#the_shebang
+ дополнения

Shebang - Это такой заголовок файла, он определяет интерпретатор, например такой::

#!/bin/bash
echo "Hello world..."

Эта штука обычно: 1) интерпретируется ядром системы. В общем, если файл исполняемый, но на самом деле это не бинарная программа, и такая строка присутствует запускается программа, которая написана после #! и скрипт-файл передается ей в качетсве параметра. Эти два символа # и ! должны быть первые два байта в файле!

Вы можете дать в качестве интерпретатора - программу echo:

#!/bin/echo

Здесь не нужно тело скрипта, т.к. файл не будет интепретироваться "echo" и выполняться, но зато можно будет видеть что система вызывает "/bin/echo" с именами файлов, которые идут в качестве параметров.

$ /home/bash/bin/test testword hello
/home/bash/bin/test testword hello

Тоже самое происходит с #!/bin/bash оболочка "/bin/bash" вызывается с файлом скрипта в качестве аргумента. Это тоже самое что выполнить. "/bin/bash /home/bash/bin/test testword hello"!

Если интерпретатор может быть определен с аргументами, то он может быть системно-зависимым (смотрите [[1]]). Вот например, когда bash выполняет скрипт с #!/bin/bash-shebang, то он игнорирует свой shebang, потому что первый символ решетка, "#", означает что далее строчка представляет комментарий. Shebang - это для операционной системы, а не для оболочки. Программы, которые не игнорируют такую строчку, могут не работать в таком режиме.

Внимание: Когда определенного интерпретатора нет или он не может выполнять (нет прав на выполнение) вы получите сообщение ошибку "bad interpreter". Если вы "ничего не делали" и получили эту ошибку - проверьте shebang. Старшие версии bash пишут сообщение "no such file or directory" для несуществующего интерпретатора.

Дополнительное примечание: Когда вы определяете '#!/bin/sh как shebang, а это /bin/sh - симлинк на bash, тогда bash будет работать в POSIX®-mode!

Содержание

[править] Переносимость

Команду env используют для улучшения переносимости скриптов (см. enwp:Shebang_(Unix)#Portability), т.к. путь к интерпретаторам в разных системах может отличаться, а путь к env одинаковый в большинстве операционных систем:

#!/usr/bin/env python2
print "Hello World."

[править] Скрипт в качестве интерпретатора

Можно ли указать другой скрипт в качестве интерпретатора?

Например, у вас есть скрипт /usr/local/bin/interpreter, написанный на Python. Что будет если указать его в shebang-строке другого скрипта?

 #!/usr/local/bin/interpreter
 echo hello

В Linux, начиная с 2.6.27, и в MINIX этот скрипт будет использоваться как обычная программа. Во всех остальных юниксах в качестве интерпретатора вызовется /bin/sh[1].

В последнем случае из ситуации можно выйти с помощью env:

 #!/usr/bin/env /usr/bin/python /usr/local/bin/interpreter

[править] Дополнительная информация

  • /usr/bin/env behaviour? (англ.) — проблемы с длинными (содержащими большое число элементов) строками-shebang. Проблема обсуждается в списке рассылки NetBSD, но вообще аналогичная проблема существует во многих (если не во всех) юниксах

[править] Примечания

  1. http://www.in-ulm.de/~mascheck/various/shebang/
Источник — «http://xgu.ru/wiki/Shebang»