Це не обов'язково краще.
Перевага #!/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
для деталей).