На этот вопрос уже есть ответ здесь:
Я заметил, что запускаются некоторые скрипты Python с
#!/usr/bin/env python
вместо
#!/usr/bin/python
Являются ли скрипты Python единственными, которые используют #! / usr / bin / env
? Существуют ли какие-либо сценарии, которые начинаются, например, с #! / Usr / bin / env bash
или #! / Usr / bin / env perl
? Если нет, то почему скрипты Python отличаются?
Ответ Jacob объясняет это хорошо. Однако существует еще один момент, который я хотел бы упомянуть.
Используя /usr/bin/env/
в Python служит еще одной цели. Поскольку Python поддерживает , виртуальные среды , с помощью /usr/bin/env python
удостоверятся, что сценарии работают в виртуальной среде, если Вы - внутренний. Принимая во внимание, что, /usr/bin/python
будет работать вне виртуальной среды.
В дополнение к ответам, данным выше, использование /usr/bin/env
позволяет Вашему Python быть установленным в нестандартных местах, и, пока Ваш PATH
установка правильно, сценарий будет работать неизмененный в любой системе стиля UNIX, которая имеет /usr/bin/env
. Это включает любую современную версию Linux и OS/X.
Сценарии Python не отличаются от сценариев ни на каком другом языке на этом.
Любой использование #!/usr/bin/env python
или #!/usr/bin/python
играет роль, если сценарий является исполняемым файлом, и названный без предыдущего языка. Сценарий затем называет интерпретатор языка для выполнения кода в сценарии, и хижина является "руководством" для нахождения в примере, python
.
Используя #!/usr/bin/env python
вместо абсолюта (полный путь) #!/usr/bin/python
удостоверяется, что Python (или интерпретатор любого другого языка) найден, в случае, если это не могло бы быть в точно том же месте через другой Linux - или Unix - как дистрибутивы, как объяснено, например, здесь.
Хотя #!/usr/bin/python
будет работать над системой Ubuntu по умолчанию, это - поэтому хорошая практика для использования #!/usr/bin/env python
вместо этого.
env
исполняемый файл в /usr/bin
, или, как упомянуто @hvd (благодарит за подсказку!), доступный как символьная ссылка совместимости в /usr/bin
кому: env
, в в значительной степени всех дистрибутивах Linux.
Из Википедии:
ENV является командой оболочки для Unix и подобных Unix операционных систем. Это используется, чтобы или распечатать список переменных среды или выполнить другую утилиту в измененной среде, не имея необходимость изменять в настоящее время существующую среду. Используя ENV, переменные могут быть добавлены или удалены, и существующие переменные могут быть заменены путем присвоения новых значений им.
и относительно Вашего вопроса:
На практике ENV имеет другое общее использование. Это часто используется сценариями оболочки для запуска корректного интерпретатора. В этом использовании обычно не изменяется среда
Больше на env
должен быть найден здесь, и, как всегда, в man env
(от терминала).
В комментарии попросили, почему мы не можем просто использовать #!python
как хижина. Так как интерпретатор находится в $PATH
, идея понятна.
Причина состоит в том, что исполняемый файл выполняется execve
, поскольку мы можем читать здесь. Конкретно строки:
Сценарий интерпретатора является текстовым файлом, который имеет, выполняются, разрешение включило и чья первая строка имеет форму:
#! interpreter [optional-arg]
Интерпретатор должен быть допустимым путем для исполняемого файла....
объясните это execve
требует весь (допустимый) путь к интерпретатору. Это имеет смысл, так как сценарии (на любом языке) могут, например, быть выполненными в любой момент во время запуска также, возможно прежде $PATH
установлен вообще.