Це не обов'язково краще.
Перевага #!/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трюк, і постачальники ОС, швидше за все, не зроблять нічого, щоб зламати його. Це може бути проблемою, якщо ви хочете, щоб ваш скрипт працював у дійсно старій системі, але тоді вам, швидше за все, потрібно буде його змінити.
Інша можлива проблема (завдяки Сопаладжо де Арріерес за те, що він вказав це у коментарях) - це те, що роботи з крон працюють із обмеженим середовищем. Зокрема, $PATHтипово щось подібне /usr/bin:/bin. Отже, якщо каталог, що містить інтерпретатора, не знаходиться в одному з цих каталогів, навіть якщо він за замовчуванням $PATHзнаходиться в оболонці користувача, то /usr/bin/envфокус не працює. Ви можете вказати точний шлях, або ви можете додати рядок у свій crontab для встановлення $PATH( man 5 crontabдля деталей).