Файл скрипта, упрощенный для экспериментов:
#!/bin/sh
if test -f /home/vl/docker-test/envvars; then . /home/vl/docker-test/envvars; fi
Содержимое файла envvars:
export APACHE_RUN_USER=www-data
Ничего не происходит после запуска скрипта, ни вывода, ни ошибки. Проверка, содержит ли env переменную из envvars, нет, нет:
$ env | grep -i apache
вывод пустой.
Но:
$ if test -f /home/vl/docker-test/envvars; then . /home/vl/docker-test/envvars; fi
$ env | grep -i apache
APACHE_RUN_USER=www-data
Что я делаю не так в своем сценарии?
.
применяется в текущей рабочей среде. В первом случае это сценарий (и исчезает, когда сценарий выполнен). Во втором случае это оболочка. Если вы хотите, чтобы скрипт влиял на оболочку, в которой он работает, вам нужно .
его в оболочку, а не запускать как скрипт.
Итак, если ваш скрипт bring-in-vars
, вы в настоящее время делаете что-то вроде этого (запускаете его как ребенок):
./bring-in-vars
И вам нужно сделать это (получив его в текущую оболочку):
. ./bring-in-vars
Дети не могут по своему замыслу изменить своих родителей.
apache2ctl не предназначен для установки переменных среды в вызывающей программе. Он предназначен для запуска команд Apache. Если вы хотите получить envvars
, вам следует получить envvars
. Ваш вопрос не связан с apache2ctl. Однако сценарий, который вы указали в своем вопросе, должен работать таким образом. Какую проблему вы пытаетесь решить на самом деле? meta.stackexchange.com/questions/66377/what-is-the-xy-problem
Ну хорошо, спасибо за ваше объяснение. Я устанавливаю ваш ответ как решение для теоретической части. К сожалению, практическая часть не работает в обеих моих системах (Ubuntu 22.04 и внутри док-контейнера на основе 18.04), как я отметил в своем предыдущем комментарии.
#!/bin/sh set -e if test -f /etc/apache2/envvars; then . /etc/apache2/envvars; fi rm -f /var/run/apache2/apache2.pid > /dev/null 2>&1 exec /usr/sbin/apache2 -DFOREGROUND "$@"
TY за быстрый ответ, но запуск
. path/to/bring-in-vars
не имел смысла (./path... и . ./path... почему-то не работает). На самом деле, я реализую хорошо известный скрипт apache2ctl, поэтому я скопировал оттуда часть экспорта vars, но я сомневаюсь, что люди запускают apache2ctl как . ./usr/sbin/apache2ctl