Этак с начала времён (юниксовых, т.е. 1.01.1970) в начале скрипта рекомендовалось использовать shebang / hashbang - строку, указывающую на используемый интерпретатор, например:
#!/bin/bash
echo 'hello world'
#!/usr/bin/python
print 'hello world'
#!/usr/bin/python3
print('hello world')
Недавно наткнулся на рекомендацию использовать вместо этого такую форму:
#!/usr/bin/env bash
echo 'hello world'
#!/usr/bin/env python
print 'hello world'
#!/usr/bin/env python3
print('hello world')
Пожалуйста, объясните, как это работает и в чём преимущества такого подхода? Если есть ограничения и/или недостатки по сравнению с обычным способом - то и о них хотелось бы услышать.
Ответ
Основная идея - улучшение переносимости. Не гарантируется, что на различных системах исполняемый файл будет лежать по пути, который указан в shebang.
Использование env позволяет снизить этот риск за счет запуска команды на основе данных из переменной среды PATH
Более того, если по каким-либо причинам вместо стандартного исполняемого файла пользователь хочет использовать свой, то ему достаточно добавить путь к этому файлу в PATH без необходимости исправления скриптов:
~ $ cp /bin/bash /home/soon/python
~ $ export PATH=/home/soon:$PATH
~ $ env python
[soon@archlinux ~]$ exit
В примере выше я скопировал bash к себе в домашнюю директорию (переименовав при этом файл в python), добавил путь в PATH и запустил python с помощью env, которая усужливо запустила bash, т.к. нашла его раньше.
Еще одним примером является использование виртуальных окружений при разработке на Python (virtualenv). Поскольку они также перебивают PATH, env позволяет использовать нужную версию исполняемого файла:
~ $ workon black-box-challenge-2016-py2
~ (venv:black-box-challenge-2016-py2) $ env python
Python 2.7.11 (default, Mar 31 2016, 06:18:34)
[GCC 5.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.executable
/home/soon/.virtualenvs/black-box-challenge-2016-py2/bin/python
>>>
Комментариев нет:
Отправить комментарий