Почему нужно использовать env ‹executable› вместо исполняемого файла, даже если нет необходимости предварительно задавать переменные среды?

Почему рекомендуется использовать / usr / bin / env python вместо / usr / bin / python. Это было вдохновлено чтением ответов здесь: Что я использую в Linux для создания исполняемого файла программы на Python

Я думаю, что оба будут делать одно и то же, но ответ, в котором оба упоминаются одинаково, имеет 2 голоса, а не 88 голосов за ответ, в котором говорится об использовании env. Люди, кажется, действительно согласны с использованием env, но не объясняют почему. Помогает ли env найти какой-либо исполняемый файл с именем «python», а не только тот, который находится по определенному пути, который пользователь мог настроить?

Мне действительно интересно узнать о различных преимуществах и вариантах использования env, но man env этого не объяснил. man env только говорит, что вы можете использовать env для установки переменных среды перед запуском, NAME = VALUE, но мы не делаем этого в связанном примере.

Я чувствую, что сообщество явно рекомендует использовать env, но мое собственное исследование не намекало на причину, поэтому, если у вас есть идеи, почему это хорошо или хорошо, пожалуйста, ответьте.


person Starman    schedule 08.06.2017    source источник
comment
unix.stackexchange.com/questions/29608/   -  person William Pursell    schedule 08.06.2017


Ответы (1)


Использование #!/usr/bin/env python гарантирует, что используется первый интерпретатор Python в текущем определенном PATH, учитывая любые пользовательские переопределения (которые для Python включают virtualenvs и т.п.).

Это особенно важно для таких сред, как MacOS, где пакеты поставщиков ОС часто устарели (например, /bin/bash - это 3.2 - серия выпуска с 2006 года, - тогда как если у пользователя есть MacPorts или Homebrew, /opt/local/bin/bash или /usr/local/bin/bash может быть современным 4.x; таким образом, #!/usr/bin/env bash получит преимущество любого обновленного интерпретатора bash, установленного пользователем, будь то общесистемный или в своем домашнем каталоге, до тех пор, пока местоположение этого интерпретатора присутствует в их PATH во время выполнения ).

person Charles Duffy    schedule 08.06.2017
comment
Не просто версии, а иногда и существование. Если сценарий жестко кодирует #!/usr/bin/python, но в системе установлено /bin/python, все сценарии завершатся ошибкой. - person William Pursell; 08.06.2017