Страница 1 из 1

поведение переменного окружения

Добавлено: 30.05.2015 23:39
BigBrother
Всем привет. Имеем сервер fedora21. Добавил файл /etc/profile.d/my-custom.sh с содержимым

Код: Выделить всё

DB=/srv/db
PATH=$PATH:/srv/db

if [ ! -e ~/.test-file ]; then
   touch ~/.test-file
fi

Инструкции в этом файле, автоматически выполняются для всех юзеров, когда они логинятся в систему. touch тут для тестов, чтобы убедится что файл test-file создается в папке каждого юзера - в смысле что содержимое my-custom.sh выполняется. Программы, которые для своего запуска требуют переменную DB, отказываются работать, т.к. не видят этой переменной, пока перед запуском программы не сделаешь echo $DB. Делаю команду cmd_run $DB/next_dir получаю ошибку, программа говорит что не видит бд по пути /next_dir (правильно, там ее и нет, т.к. переменная $DB не подставилась). Потом делаю echo $DB (получаю путь /srv/db), после чего ещё раз запускаю cmd_run $DB/next_dir и теперь все ок, т.к. программа уже ищет бд в /srv/db/next_dir.
Пробовал в файл вместо "DB=/srv/db" писать "export DB=/srv/db" - не помогает. В чем может быть проблема? Почему консольная программа, видит переменную только после echo, хотя эта переменная уже есть в env?

Re: поведение переменного окружения

Добавлено: 31.05.2015 06:21
yars
export DB в конец скрипта добавьте.

Re: поведение переменного окружения

Добавлено: 31.05.2015 12:21
BigBrother
Это не помогает.

Re: поведение переменного окружения

Добавлено: 31.05.2015 13:30
Bizdelnick
BigBrother писал(а):
30.05.2015 23:39
Почему консольная программа, видит переменную

В данном случае она никакую переменную не видит и видеть не должна, её должен раскрыть шелл и передать команде уже полный путь. echo на это никак не влияет.
Что за шелл?

Re: поведение переменного окружения

Добавлено: 04.06.2015 17:07
BigBrother
Bizdelnick писал(а):
31.05.2015 13:30
В данном случае она никакую переменную не видит и видеть не должна, её должен раскрыть шелл и передать команде уже полный путь. echo на это никак не влияет.

Проблема была в том, что команда cmd_run $DB/next_dir передается процессу в системе, который работает от рута и который запускает эту команду каждый раз от разных юзеров, и вот по этому, переменные окружения не применялись. Решение - перед выполнение команды, добавить команду source /etc/profile.d/my-custom.sh и теперь все ок.

Bizdelnick писал(а):
31.05.2015 13:30
Что за шелл?

bash

Re: поведение переменного окружения

Добавлено: 04.06.2015 17:13
Bizdelnick
BigBrother писал(а):
04.06.2015 17:07
команда cmd_run $DB/next_dir передается процессу в системе, который работает от рута и который запускает эту команду каждый раз от разных юзеров, и вот по этому, переменные окружения не применялись

Переменные окружения могут сохраняться или нет в зависимости от того, каким образом меняете пользователя (опций su/sudo).

Re: поведение переменного окружения

Добавлено: 04.06.2015 19:00
BigBrother
Bizdelnick писал(а):
04.06.2015 17:13
Переменные окружения могут сохраняться или нет в зависимости от того, каким образом меняете пользователя (опций su/sudo).

Не совсем понятно как они могут сохраниться, если профиль юзера про них ничего не знает? Или переменные окружения можно передать/скопировать от одного юзера другому?
Не известно как переключатся пользователи, через sudo/su или другими способами, т.к это сторонняя разработка, а копаться в исходниках нет желания.

Re: поведение переменного окружения

Добавлено: 04.06.2015 19:06
Bizdelnick
BigBrother писал(а):
04.06.2015 19:00
Не совсем понятно как они могут сохраниться, если профиль юзера про них ничего не знает?

Так и профиль пользователя вовсе не обязательно загружать (он по умолчанию и не загружается ни su, ни sudo). Если речь о su, см. опции -m и -p, для sudo — -E.

Re: поведение переменного окружения

Добавлено: 06.06.2015 09:57
BigBrother
Вопрос в тему ENV-a.
Почему либы для перла надо указывать с помощью export, а свои кастомные переменные, такие как $DB (см. выше) можно указать без export?
export PERL5LIB=/srv/custom/lib/perl5/site_perl - работает
PERL5LIB=/srv/custom/lib/perl5/site_perl - не работает: Can't locate NAME.pm in @INC (you may need to install the NAME module) ...

Re: поведение переменного окружения

Добавлено: 06.06.2015 15:47
Bizdelnick
Если переменная не экспортирована, в окружении её нет. О ней знает только оболочка, которая может её раскрыть при необходимости. После того, как переменную экспортировали, она становится доступной запускаемым дочерним процессам.