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, но вообще аналогичная проблема существует во многих (если не во всех) юниксах
[править] Примечания
Интерфейс командной строки | |
---|---|
Основы | Потоки ввода/вывода • Командная строка |
Пользовательское окружение | Оболочка интерпретатора • Приглашение командного интерпретатора • bash_completion • shopt |
Скриптинг | Скриптинг • Интерпретатор • Shebang • Shell-скриптинг • shell-framework • expect • awk • sed |