Что это значит в скриптах Linux? #! / usr / bin / python -tt - PullRequest
18 голосов
/ 29 января 2012

Я знаю, что в начале сценариев .sh bash

#!/bin/bash

указывает на исполняемый файл интерпретатора команд.

Но во время просмотра Google Python Class 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 ]

15 голосов
/ 29 января 2012

Вопрос № 1) Линия называется Шебанг, и нет правильной формы, которая работает универсально. например,

#!python
#!/usr/bin/python
#!/usr/local/bin/python
#!/usr/bin/python -t

являются действительными / приемлемыми формами, но могут работать не во всех системах:

#!python будет работать, только если исполняемый файл python находится где-нибудь в PATH вашей оболочки

#!/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

в приглашении оболочки. Вы можете передавать произвольные аргументы командной строки интерпретатору в строке shebang.

Вопрос № 3)

Строка интерпретируется ядром ОС и оболочкой, которую вы используете в данный момент. Материал после #! просто сообщает ОС, какую программу нужно запустить, чтобы «выполнить» оставшуюся часть сценария.

Вопрос № 4)

Синтаксис сценария зависит от языка, который вы используете. Например. скрипт оболочки PHP должен иметь вид

#!/usr/bin/php
<?php
  ... php code here ...

A #!/usr/bin/perl Perl-скрипт должен использовать синтаксис Perl и т. Д. Если вы поместите PHP-код с Perl-шебангом, у вас просто будет Perl, запустивший скрипт с ошибками синтаксиса, так как PHP-код НЕ код perl

Вопрос № 5)

Shebangs предназначены для систем Unix, где расширения файлов никогда не использовались для идентификации типов файлов в ОС. Файл .c понимался как файл исходного кода на языке Си, но это всего лишь соглашение. Вы можете поместить скрипт оболочки Bash в файл .c, сделать его исполняемым, а с помощью #!/bin/bash shebang он будет выполняться как скрипт Bash.

Определение типов исполняемых файлов по расширению файла - это больше для Windows.

Вопрос № 6)

Это возвращает нас к вопросу № 1 - если shebang утверждает, что интерпретатор находится на каком-то ДРУГОМ пути, чем тот, где он находится, этот конкретный сценарий не может быть выполнен до тех пор, пока shebang не будет исправлен, или интерпретатор не будет перемещен. Шебанги очень удобны, но не безошибочны.

К счастью, в наши дни большинство переводчиков устанавливаются в довольно стандартных местах, поэтому было бы несколько необычно найти, скажем, Perl, установленный на /some/wonky/weird/path вместо /usr/bin

6 голосов
/ 29 января 2012

С справочной страницы:

-t выдает предупреждение, когда исходный файл смешивает табуляции и пробелы для отступа таким образом, чтобы это зависело от стоимости вкладки выражается в пробелах. Выдать ошибка, если опция указана дважды.

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

Например

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

Даже шебанги необходимы только в том случае, если вы хотите запустить скрипт с использованием $. / Script, так как в этом случае вы не упомянули интерпретатор, который хотите использовать.

1 голос
/ 29 января 2012
  1. #! / Usr / bin / env python
  2. выдает ошибки о непоследовательном использовании вкладок
  3. Kernel
  4. #! / Path_to_the_interpreter или / usr / bin / env
  5. * nix вообще не проверяет экстензинон (за исключением того, что некоторые DE могут это сделать)
  6. Вот почему вы должны использовать #! / Usr / bin / env

Больше информации на вики

0 голосов
/ 29 января 2012

Это называется шебанг. Он сообщает системе, что он должен передать файл в качестве аргумента указанной программе, а не пытаться выполнить его как таковой.

Прежде всего, какова правильная форма этой линии? а почему?

Правильный путь - везде, где установлен ваш интерпретатор Python. Аргументы (-tt) будут зависеть от того, что вы хотите. Некоторые люди настаивают на #!/usr/bin/env на случай, если переводчик окажется где-то в другом месте.

Что означает ключ -tt в #! / Usr / bin / python -tt?

Я не использую python, поэтому кто-то другой должен ответить на этот вопрос.

Когда я запускаю какой-либо скрипт в Linux (не точный скрипт Python), какая программа анализирует и использует эту строку? Я считаю, что это не bash, потому что даже для сценариев bash эта строка необходима.

Я слышал (и уверен), что это ядро. Даже если бы это был bash, ему понадобилась бы строка, сообщающая bash, что это должен быть скрипт, который он должен интерпретировать, а не передавать другой программе. /usr/bin/env - это команда, которая ищет в PATH указанный аргумент и передает скрипт через программу, которую находит.

Какой синтаксис этой строки для любого скрипта? И как называется интерпретатор, который его анализирует?

Синтаксис такой же, как в командной строке, #!command arguments, но command должен быть абсолютным путем, PATH не ищется.

Почему эта строка так необходима, если у каждого файла есть расширение?

Расширения ничего не значат в * nix. Я мог бы назвать bash-скрипт script.pl, script.exe или даже script без расширения. Если скрипт имеет правильную строку shebang, он проходит через правильный интерпретатор, в противном случае ядро ​​пытается выполнить его как исполняемый файл и завершается неудачно. Система не знает о расширениях. Это соглашение для пользователей, ничего более.

А что на счет того, что в каждом компьютере интерпретатор для какого-то рода сценариев будет храниться в другом месте, чем в другом? И скрипт не может быть запущен.

Если я правильно понимаю, вы говорите, что разные системы / дистрибутивы содержат переводчиков в разных местах (например, /usr/bin/python и /usr/local/bin/python), и спрашиваете, как система знает, какой использовать?
Ответ в том, что он использует тот путь, который вы указали. На самом деле это небольшая проблема с исполняемыми скриптами, и причина, по которой /usr/bin/env вошел в моду. Как я уже сказал, env ищет в PATH правильного переводчика, поэтому, пока ваша система имеет /usr/bin/env, вы настроены, вам не нужно искать или гарантировать местонахождение переводчика.

0 голосов
/ 29 января 2012

Различные пути к месту установки интерпретатора Python.Различные версии Linux устанавливают его в разных местах.

Linux не заботится о расширениях, это WindowsТо, где файлы хранятся, вызывается и используется, основано на определенных местах, где файлы должны быть и расположены программным обеспечением.Dev для устройств, дом для пользовательской области, корзина для программ.Но со временем для разных систем требуются разные места.

Я бы предложил получить книгу по Linux / Unix и изучить основы файловой системы.Это очень помогает.

...