Что это значит в скриптах linux? #!/ usr / bin / python-tt
Я знаю, что в начале .SH bash скрипты
#!/bin/bash
который указывает на исполняемый файл interpeter команды.
но во время просмотра класса Google Python http://www.youtube.com/watch?v=tKTZoB2Vjuk я заметил, что для python они используют
#!/usr/bin/python -tt
. В Интернете я также нашел такие стили эту запись:
#!/usr/local/bin/python
и даже
#!/usr/bin/env python
.
Итак, я новичок в Python и я обычный пользователь Linux и у меня есть несколько вопросов про эту "волшебную" строку:
- прежде всего, какова правильная форма этой строки? и почему?
- что означает ключ-tt в #!/ usr/bin / python-tt ?
- какая программа анализирует эту строку в Linux?
- какой синтаксис этой строки для любого сценария?
- почему эта строка так необходима, если каждый файл имеет расширение?
- а как насчет этого на каждом компьютере интерпретатор для каких-то скриптов будет храниться в другом месте, чем в другом? И сценарий не мог быть запущен.
это действительно интересно для меня. Что это за линия? Почему эта линия? Как написать эту строку? Почему именно так?...
5 ответов
Вопрос №1) строка называется shebang, и нет правильной формы, которая работает универсально. например,
#!python
#!/usr/bin/python
#!/usr/local/bin/python
#!/usr/bin/python -t
все допустимые / приемлемые формы, но не могут работать на всех системах:
#!python
будет работать, только если исполняемый файл python находится где-то в пути вашей оболочки
#!/usr/bin/python
работает, только если двоичный файл python фактически находится в /usr/bin
#!/usr/local/bin/python
также работает, только если python находится в/usr/local / bin
вопрос #2)
#!/usr/bin/python -tt
передает -tt
опция для python, как если бы вы сделали:
$ python -t somescript.py
в командной строке. Вы можете передать аргументы командной строки arbitary интерпретатору в строке shebang.
Вопрос #3)
строка интерпретируется ядром ОС и оболочкой, которую вы в настоящее время используете. Материал после #!
просто сообщает ОС, какая программа должна быть запущена, чтобы "выполнить" остальную часть скрипт.
Вопрос #4)
синтаксис скрипта зависит от используемого языка. Е. Г. PHP-скрипт Shell должен иметь форму
#!/usr/bin/php
<?php
... php code here ...
A #!/usr/bin/perl
Perl-скрипт должен использовать синтаксис Perl и т. д... Если вы поместите PHP-код с Perl shebang, у вас просто будет Perl barf скрипт с синтаксическими ошибками, так как PHP-код не код perl
Вопрос № 5)
Shebangs предназначены для систем Unix, где расширения файлов никогда не использовались для идентификации типов файлов в ОС. А .c
файл понимался как файл исходного кода языка C, но это всего лишь соглашение. Вы можете поместить сценарий оболочки Bash в .c
файл, сделайте его исполняемым и с помощью #!/bin/bash
shebang, он будет выполняться как сценарий Bash.
определение исполняемых типов по расширению файла является более Windows вещь.
Вопрос № 6)
что уходит корнями в вопрос № 1 - Если shebang утверждает, что интерпретатор находится на каком-то другом пути, чем там, где он есть, этот конкретный скрипт не может быть выполнен, пока shebang не исправлен или интерпретатор перемещен. Shebangs очень удобны, но не непогрешимы.
к счастью, большинство переводчиков установлены в довольно стандартных местах в эти дни, поэтому было бы несколько необычно найти (скажем) Perl, установленный в /some/wonky/weird/path
вместо /usr/bin
из manpage:
- t выдает предупреждение, когда исходный файл смешивает вкладки и пробелы для отступа таким образом, что это зависит от стоимости вкладки выражается в пробелах. Вопрос ошибка, когда опция задана дважды.
- правильная форма строки-это та, которую вы хотите использовать.
- это интерпретатор, который читает эту строку, известную как shebang. Если вы пишете скрипт python с первую строку "#!/usr/bin /python" и вызвать его с помощью bash, это интерпретатор/bin / sh, который читает первую строку и запускает правильный интерпретатор.
- это shebang. Синтаксис функции состоит из последовательности символов #!, т. е. знак числа и восклицательный знак
- расширения файлов не актуальны в linux вообще. У вас может быть скрипт python, который не имеет .py расширение.
для ex.
shadyabhi@archlinux ~ $ cat a
print "Hello World"
shadyabhi@archlinux ~ $ python2 a
Hello World
shadyabhi@archlinux ~ $
даже shebangs необходимы только если вы хотите запустить скрипт с помощью $./ script, поскольку в этом случае вы не упомянули интерпретатор, который хотите использовать.
- #!/ usr/bin / env python
- выдать ошибки о несогласованном использовании вкладки
- ядро
- #!/path_to_the_interpreter или / usr/bin / env
- * nix вообще не проверяет extensinon (за исключением некоторых DE)
- вот почему вы должны использовать #!/ usr/bin / env
более подробная информация wiki
различные пути - туда, где был установлен интерпретатор python. Разные вкусы Linux устанавливают его в разных местах.
Linux не заботится о расширениях, это вещь Windows.
сеанс bash использует строку для вызова правильного интерпретатора для сценария, который вы запускаете.
различные места, где файлы хранятся, вызываются и используются, основаны на определенных местах, где файлы должны быть и расположены программным обеспечением. Разработка для устройств, главная для пользователя сохраненная область, бункер для программ. Но с течением времени разные системы требуют разных местоположений.
Я бы предложил получить книгу по Linux / Unix и изучить основы файловой системы. Это очень помогает.
это называется shebang. Он сообщает системе, что он должен передать файл в качестве аргумента указанной программе, а не пытаться выполнить его как таковой.
прежде всего, какова правильная форма этой строки? и почему?
правильный путь находится там, где установлен интерпретатор python. Аргументы (-tt
) будет зависеть от того, что вы хотите. Некоторые люди настаивают на #!/usr/bin/env
в случае, если интерпретатор elewhere.
что делает-TT ключ означает в #!/ usr/bin / python-tt ?
я не использую python, поэтому кто-то другой должен будет ответить на это.
когда я запускаю любой скрипт в Linux (не точный скрипт Python), какая программа анализирует и использует эту строку? Я считаю, что это не bash, потому что даже для сценариев bash эта строка необходима.
я слышал (и уверен), что это ядро. Даже если бы это был Баш, нужна была бы строка, чтобы сказать bash, что это должен быть сценарий, который он должен интерпретировать, а не передавать другой программе. /usr/bin/env
- это команда, которая ищет PATH
для указанного аргумента и передает скрипт через программы, которые он находит.
какой синтаксис этой строки для любого сценария? И как называется interpeter, который анализирует его?
синтаксис такой же, как в командной строке #!command arguments
, а command
должен быть абсолютный путь, PATH
не обыскивают.
почему эта строка так необходима, если каждый файл имеет расширение?
расширения ничего не значат в *nix. Я мог бы назвать сценарий bash script.pl
, script.exe
, или даже script
без расширения. Если скрипт имеет правильную строку shebang, он проходит через правильный интерпретатор, иначе ядро пытается выполнить его как исполняемый файл и терпит неудачу. Система не знает о расширениях. Они конвенции для пользователей, ничего больше.
а как насчет того, что в каждом компьютере интерпретатор для каких-то скриптов будет храниться в другом месте, чем в другом? И сценарий не мог быть запущен.
если я правильно понимаю, вы говорите, что разные системы / распределения держат интерпретаторов в разных местах (например,/usr/bin/python
и /usr/local/bin/python
), и спрашивает, как система знает, что использовать?
Ответ в том, что он использует тот, который находится в абсолютный путь ты ему дал. Это на самом деле небольшая проблема с исполняемыми скриптами, и причина, почему /usr/bin/env
вошло в моду. Как я уже сказал,--13--> ищет PATH
для правильного переводчика, так как ваша система имеет /usr/bin/env
, вы настроены, вам не нужно искать или гарантировать местоположение интерпретатора.