Это не обязательно лучше.
Преимущество #!/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для деталей).