Это не обязательно лучше.
Преимущество #!/usr/bin/env python
заключается в том, что он будет использовать любой python
исполняемый файл, который появляется первым у пользователя $PATH
.
Недостаток в #!/usr/bin/env python
том , что он будет использовать любой python
исполняемый файл появляется первым в пользователе $PATH
.
Это означает, что скрипт может вести себя по-разному в зависимости от того, кто его запускает. Для одного пользователя он может использовать тот, /usr/bin/python
который был установлен вместе с ОС. Для другого, это могло бы использовать эксперимент /home/phred/bin/python
, который не совсем корректно работает.
И если python
только установлен в /usr/local/bin
, пользователь , который не имеет /usr/local/bin
в $PATH
даже не в состоянии запустить скрипт. (Это вероятно не слишком вероятно в современных системах, но это может легко произойти для более неясного интерпретатора.)
Указывая, #!/usr/bin/python
вы точно указываете, какой интерпретатор будет использоваться для запуска сценария в конкретной системе .
Другая потенциальная проблема заключается в том, что #!/usr/bin/env
уловка не позволяет передавать аргументы интерпретатору (кроме имени сценария, который передается неявно). Это , как правило , не является проблемой, но это может быть. Многие Perl-скрипты написаны с использованием #!/usr/bin/perl -w
, но use warnings;
это рекомендуемая замена в наши дни. Сценарии Csh должны использоваться, #!/bin/csh -f
но сценарии csh не рекомендуются в первую очередь. Но могут быть и другие примеры.
У меня есть несколько сценариев Perl в персональной системе контроля версий, которые я устанавливаю при настройке учетной записи в новой системе. Я использую #!
установочный скрипт, который изменяет строку каждого скрипта, так как он устанавливает его в моем $HOME/bin
. (Мне не приходилось использовать ничего, кроме #!/usr/bin/perl
последнего времени; это восходит к временам, когда Perl часто не устанавливался по умолчанию.)
Незначительный момент: #!/usr/bin/env
хитрость, возможно, заключается в злоупотреблении env
командой, которая изначально была предназначена (как следует из названия) для вызова команды с измененной средой. Кроме того, некоторые старые системы (включая SunOS 4, если я правильно помню) не имели env
команды /usr/bin
. Ни один из них, вероятно, не будет серьезной проблемой. env
работает так, многие скрипты используют эту #!/usr/bin/env
хитрость, и поставщики ОС вряд ли что-то предпримут, чтобы ее сломать. Это может быть проблемой, если вы хотите, чтобы ваш скрипт работал на действительно старой системе, но тогда вам, вероятно, придется все равно его изменить.
Другая возможная проблема (спасибо Sopalajo de Arrierez за указание на это в комментариях) заключается в том, что задания cron выполняются в ограниченной среде. В частности, $PATH
как правило, что-то вроде /usr/bin:/bin
. Таким образом, если каталог, содержащий интерпретатор, не находится в одном из этих каталогов, даже если он находится по умолчанию $PATH
в пользовательской оболочке, этот /usr/bin/env
трюк не сработает. Вы можете указать точный путь, или вы можете добавить строку в ваш crontab, чтобы установить $PATH
( man 5 crontab
для деталей).