2013-09-23 2 views
3

В Linux мы обычно добавляем shebang в скрипт для вызова соответствующего интерпретатора. Я попробовал следующий пример.Использование shebang в сценариях оболочки

Я написал сценарий оболочки без shebang и с исполняемым разрешением. Я смог выполнить его, используя ./. Но если я пишу подобную программу python, без shebang, я не могу ее выполнить.

Почему это так? Насколько я понимаю, Шебанг должен найти переводчика. Итак, как работают скрипты оболочки, но не скрипт python?

+0

Я не исследовал это, но я бы предположил (и было бы логично), что он может по умолчанию интерпретировать его как сценарий оболочки (никакого другого специального интерпретатора) – lurker

+0

Это из спецификации. Я уверен, что интерпретатор просто даст ему шанс и посмотрит, будет ли он работать сам с собой (то есть '/ bin/bash' будет пытаться использовать'/bin/bash', '/ bin/sh' будет пытаться '/ bin/sh' и т. д.). – zebediah49

+2

Возможный дубликат [Выполнение сценария Bash с и без shebang в Linux и BSD] (http://stackoverflow.com/questions/7268437/bash-script-execution-with-and-without-shebang-in-linux-and- bsd) – hop

ответ

2

Здесь есть тонкое различие. Если цель является двоичной или начинается с строки shebang #!, тогда оболочка вызывает execv. Если целью является текстовый файл без shebang, тогда вызов execv завершится неудачно, и оболочка сможет попробовать запустить его под /bin/sh или что-то еще.

5

Мое предположение заключается в том, что сценарий без shebang выполняется в текущей среде, которая в командной строке является вашей стандартной оболочкой, например. /bin/bash.

+0

Итак, если моя текущая оболочка является оболочкой python, будет ли скрипт python без работы shebang? – shar

+1

Как указывает Йоран Бисли, нет оболочки python, и если бы это было, кто знает, что он будет делать. Большинство 'sh'-подобных оболочек пытаются выполнить скрипт как сам по себе в отсутствие shebang, поэтому, если гипотетическая оболочка python сделала это, конечно, скрипт python без shebang мог бы работать. – pjmorse

4

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

3

По По умолчанию оболочка попытается выполнить сценарий. #! нотация пришла later

0

http://en.wikipedia.org/wiki/Shebang_(Unix)

Под Unix-подобные операционные системы, когда сценарий с притоном запускается как программа, загрузчик программы анализирует остаток исходной строки сценария в качестве директивы переводчика; вместо этого выполняется указанная программа интерпретатора, передавая ей в качестве аргумента путь, который изначально использовался при попытке запустить скрипт.

Теперь, когда #! не найден, каждая строка интерпретируется как команда native shell. И поэтому, если вы напишете скрипт bash и запустите его под оболочкой bash, он будет работать. Если вы запустите тот же скрипт bash, скажем, в tcsh-оболочке, он не будет работать без начального #!/Usr/bin/tcsh

Смежные вопросы