Intereting Posts
arch / xrandr / thunderbolt Максимальное разрешение экрана DP2 1024×768 Рассчитать дату с 1125 дней назад на не-GNU-системах? Могу ли я установить внешний вид для GNOME Debian? gksu replacment Сценарий оболочки для удаления нескольких файлов rsync добавляет дополнительный каталог в команду Когда монтировать / tmp (и другие временные каталоги) Макет памяти динамической загруженной / связанной библиотеки Настройка двойного монитора с различными разрешениями с использованием драйвера open source ati Добавление строки в файл через цепочку ssh Shell-скрипты для разделения чисел внутри файла Как создать горячую точку, которая не требует пароля? Существуют ли какие-либо недостатки для запуска графического интерфейса на сервере CentOS? Команда, которая принимает один числовой аргумент и выводит день недели по формуле Как переупаковать файл img, извлеченный из прошивки устройства?

прямое выполнение скриптов python

Я заметил, что иногда скрипты python запускаются напрямую, то есть /foo/bar.py , а скорее из сценария оболочки, который ничего не делает, кроме /usr/bin/python -O /foo/bar.py $@

Одним из таких примеров является сетевой менеджер wicd . /usr/bin/wicd-gtk – это сценарий оболочки, который запускает wicd-client.py :

 $ cat /usr/bin/wicd-gtk exec /usr/bin/python -O /usr/share/wicd/gtk/wicd-client.py $@ 

Какова цель этого дополнительного шага?

В чем разница, если я сразу запустил /usr/share/wicd/gtk/wicd-client.py (при условии, что он выполним)?

Вы не опубликовали полный сценарий – сценарий выполняет другие действия перед запуском wicd-client.py . Сначала он гарантирует, что существует определенный каталог и определенная символическая ссылка:

 # check_firstrun() if [ ! -d "$HOME/.wicd" ]; then mkdir -p "$HOME/.wicd" fi # Make sure the user knows WHEREAREMYFILES ;-) if [ -e "/var/lib/wicd/WHEREAREMYFILES" ] && [ ! -L "$HOME/.wicd/WHEREAREMYFILES" ]; then ln -s "/var/lib/wicd/WHEREAREMYFILES" "$HOME/.wicd/WHEREAREMYFILES" fi 

Затем он запускает Python с опцией -O , что заставляет его оптимизировать байт-код. Я не знаю, насколько это полезно.

Сценарий оболочки также заставляет /usr/bin/python использоваться, тогда как /usr/share/wicd/gtk/wicd-client.py начинается с #!/usr/bin/env python , поэтому он выбирает, какой из python приходит первым в пути поиска команд. В большинстве систем это не будет иметь никакого значения.

Обратите внимание, что в этом скрипте есть ошибка: $@ должен быть "$@" . Сценарий оболочки будет терпеть неудачу, если какой-либо аргумент содержит пробельные или подстановочные символы \[*? ,

Вы можете безопасно запустить /usr/share/wicd/gtk/wicd-client.py вручную, ~/.wicd существует ~/.wicd . Однако пакет Debian не делает его исполняемым; возможно, другие дистрибутивы.

(Чистая спекуляция следует.)

У вас есть пакетная версия Wicd, и поддерживающие пакет тестировали ее с версией Python, упакованной дистрибутивом. Тем не менее, /usr/share/wicd/gtk/wicd-client.py написано с помощью этого shebang:

 #!/usr/bin/env python 

Вполне возможно, что /usr/bin/env выбирает другой python чем /usr/bin/python , особенно если вы программируете на Python. Возможно, упаковщик хотел избежать этого, хотя бы для того, чтобы уменьшить вероятность появления проблем из-за того, что Wicd запускается под другой версией Python или библиотеки, используемые в другой версии.

И они, возможно, хотели выполнять другие подготовительные задания. wicd-gtk на Ubuntu 14.04 имеет это /usr/bin/wicd-gtk :

 #!/bin/sh # check_firstrun() if [ ! -d "$HOME/.wicd" ]; then mkdir -p "$HOME/.wicd" fi # Make sure the user knows WHEREAREMYFILES ;-) if [ -e "/var/lib/wicd/WHEREAREMYFILES" ] && [ ! -L "$HOME/.wicd/WHEREAREMYFILES" ]; then ln -s "/var/lib/wicd/WHEREAREMYFILES" "$HOME/.wicd/WHEREAREMYFILES" fi exec /usr/bin/python -O /usr/share/wicd/gtk/wicd-client.py $@