Что это значит в скриптах 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 и у меня есть несколько вопросов про эту "волшебную" строку:

  1. прежде всего, какова правильная форма этой строки? и почему?
  2. что означает ключ-tt в #!/ usr/bin / python-tt ?
  3. какая программа анализирует эту строку в Linux?
  4. какой синтаксис этой строки для любого сценария?
  5. почему эта строка так необходима, если каждый файл имеет расширение?
  6. а как насчет этого на каждом компьютере интерпретатор для каких-то скриптов будет храниться в другом месте, чем в другом? И сценарий не мог быть запущен.

это действительно интересно для меня. Что это за линия? Почему эта линия? Как написать эту строку? Почему именно так?...

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 выдает предупреждение, когда исходный файл смешивает вкладки и пробелы для отступа таким образом, что это зависит от стоимости вкладки выражается в пробелах. Вопрос ошибка, когда опция задана дважды.

  1. правильная форма строки-это та, которую вы хотите использовать.
  2. это интерпретатор, который читает эту строку, известную как shebang. Если вы пишете скрипт python с первую строку "#!/usr/bin /python" и вызвать его с помощью bash, это интерпретатор/bin / sh, который читает первую строку и запускает правильный интерпретатор.
  3. это shebang. Синтаксис функции состоит из последовательности символов #!, т. е. знак числа и восклицательный знак
  4. расширения файлов не актуальны в linux вообще. У вас может быть скрипт python, который не имеет .py расширение.

для ex.

shadyabhi@archlinux ~ $ cat a 
print "Hello World" 
shadyabhi@archlinux ~ $ python2 a 
Hello World 
shadyabhi@archlinux ~ $

даже shebangs необходимы только если вы хотите запустить скрипт с помощью $./ script, поскольку в этом случае вы не упомянули интерпретатор, который хотите использовать.


  1. #!/ usr/bin / env python
  2. выдать ошибки о несогласованном использовании вкладки
  3. ядро
  4. #!/path_to_the_interpreter или / usr/bin / env
  5. * nix вообще не проверяет extensinon (за исключением некоторых DE)
  6. вот почему вы должны использовать #!/ 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, вы настроены, вам не нужно искать или гарантировать местоположение интерпретатора.