Зачем использовать env в Шебанге?

19

Какова цель использования #!/usr/bin/env <sh|bash|python>притона по сравнению с #!/bin/bash, #!/bin/shили #!/usr/bin/python?

Tuminoid
источник
4
Существует хороший ответ здесь в отношении общего пользования окр.
Кевин Боуэн

Ответы:

11

Некоторые люди могут использовать другой Python (Perl и т. Д.), Чем системный. /usr/bin/env pythonзапускает версию, настроенную как текущую, возможно, делая скрипт более переносимым.

С другой стороны, как сообщается, некоторых систем нет /usr/bin/env. Кроме того, вы не можете использовать #!/usr/bin/env foo xв качестве замены #!foo x, потому что foo xбудет интерпретироваться как один аргумент. Так что ценность такого подхода спорна.

choroba
источник
1
Настроил где? Как info coreutils 'env invocation'я вижу, эта форма вызова проверяет, что это внешний двоичный файл, а не встроенный в оболочку, но нет никаких признаков того, как env pythonон будет отличаться python?
Туминоид
4
Ваш, PATHвероятно, включает в себя в /usr/local/binпервую очередь. Если кто-то установил Python вручную, он envбудет вызывать его, тогда как #!/usr/bin/pythonобойдется.
Роби Басак
2
virtualenvэто довольно популярный инструмент, и он устанавливает исполняемый файл Python в рабочем каталоге. Вам понадобится envхитрость, чтобы заставить его работать правильно.
Flimm
2
@Tuminoid: вы правы: так env pythonже, как python. Однако проблема в том, что вы не можете написать подобный шебанг #!python: вам нужно указать полный путь.
Андреа Корбеллини