#! / bin / sh vs #! / usr / local / bin / python в исполняемых файлах - PullRequest
0 голосов
/ 03 февраля 2019

В программе pip She-bang равен

#!/usr/local/bin/python

if __name__ == "__main__":
    # Python program body

, а в Install Certificates.command, который предлагает Python Launcher:

#!/bin/sh

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 << "EOF"

# python program body

EOF

Есть ли различия между этимидва подхода?И есть ли причина отдавать предпочтение одному?

Мне кажется, они все одинаковые, за исключением того, что у второго есть еще одна подпрограмма bash.Это правильно?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

В общем случае вы просто хотите указать, какой интерпретатор вам действительно нужен.

Вне этого иногда вы можете увидеть такие обходные пути, как хаки переносимости.В системах POSIX /usr/bin/env довольно хорошо охватывает большинство сценариев;но если вам нужна переносимость на более старые или иные специфические системы, возвращайтесь к наименьшему общему знаменателю и затем возвращайтесь к месту, где вы можете надежно работать, например, Python на множестве систем, может потребовать все виды неочевидных конструкций.(Предыдущий ответ с ответом Дэна Д. - хороший пример.)

Есть также случаи, когда вы хотите sh что-то настроить (получить некоторые переменные окружения, которые указаны в файле, которыйиспользует синтаксис sh, например), а затем передает выполнение Python;

#!/bin/sh
# source some variables
. /etc/defaults/myenv.sh
# Then run Python
exec env python -c '
# ... Your Python script here
    ' "$@"
0 голосов
/ 03 февраля 2019

Этот специфический код для скрипта Install Certificates.command был представлен в Python Issue # 17128 .Насколько я могу судить, автор не объяснил, почему он написал код таким образом.

Обратите внимание, что .command файлы - это сценарии оболочки в Mac OS X, которые можно выполнить, дважды щелкнув по нимв Finder.

Я полагаю, что вероятное объяснение состоит в том, что автор просто хотел оправдать ожидание Mac OS X, что .command файлы должны быть сценариями Shell.

Вы можете проверить это, поместив следующеесодержимое в файле ~/Desktop/test.command:

#!/usr/bin/env python
print "Hello world"

Затем просмотрите папку «Рабочий стол» в Finder и обратите внимание, что она отображается как «оболочка»:

enter image description here

(Несмотря на то, что он сообщается неверно как файл оболочки, этот сценарий Python по-прежнему может быть выполнен двойным щелчком по нему. Он не нарушает Finder или что-либо еще.)

Чтобы ответить на конкретный вопрос, одной из причин предпочтения этого шаблона может быть, как сказал Дэн Д., то, чтобы избежать ограничения линии Шебанга.

В целом, вы бы предпочли использовать #!/usr/bin/env python в качестве линии Шебанга.Создание Bash Heredoc (т. Е. Шаблона python3.6 << EOF) может создать всевозможные проблемы, например, подсветка синтаксиса не будет работать, вы должны следить за интерполяцией переменных Bash внутри Heredoc и т. Д.

0 голосов
/ 03 февраля 2019

На линии #! есть ограничение длины строки.Возможно, они сделали это, чтобы обойти это.

Опции - это путь к программе, но только если он достаточно короткий.Использование env python, которое использует путь.Или цепная загрузка, как это.

...