ZSH: Где разместить переменную среды, чтобы запущенное приложение могло ее забрать?

Мне нужна переменная окружения KEY="value" сделать доступным для приложения с графическим интерфейсом перед его запуском. Файл запуска (тот, который размещает значок на рабочем столе и боковой панели в Ubuntu) имеет значение Exec=/path/to/executable/file,

При использовании ZSH, где я должен определить эту переменную так, чтобы она была доступна для этого приложения, независимо от того, щелкаю ли я на панели запуска приложений или непосредственно в своей оболочке набираю /path/to/executetable/file?

В командной строке я попытался ввести оба KEY="value" а также export KEY="value" до нажатия на лаунчер, но, похоже, это не сработало. Я также попробовал обе эти строки в моем ~/.zshrc, сделал source ~/.zshrc затем снова щелкнул лаунчер, но это тоже не сработало.

В какой файл он должен войти? Я считаю, что есть выбор ~/.zshenv, ~/.zprofile, ~/.zshrc, а также ~/.zlogin,

(Для бонусных баллов, я должен использовать export или нет?)

(Должен ли я по крайней мере выйти из системы и снова войти в нее, прежде чем переменная станет доступной приложению при запуске из модуля запуска?)

2 ответа

Решение

Поскольку вы хотите, чтобы переменная была также определена в оболочках вашего терминала (интерактивная оболочка без входа в систему) и для значков средства запуска на рабочем столе (X-сервер запущен неинтерактивной оболочкой входа в систему), вы должны поместить это определение в свой файл. ~/.zshenv,

И да, вам нужно перезапустить x-session, чтобы новая среда была доступна для ваших значков на рабочем столе. Представьте себе такую ​​схему запуска: Graphical Login -> Use your default shell to start the X session -> Desktop -> Shell terminal / Launch program via icon таким образом, дочерние оболочки наследуют среду от родительской, которая используется для запуска сеанса X. Эта оболочка читает RC-файлы только один раз - при входе в X сессию.

За бонусный балл. Вот что говорится в руководстве:

export [ name[=value] ... ] Указанные имена помечаются для автоматического экспорта в среду последующих выполненных команд. (...)

Если вы определите свою переменную в ~/.zshenv Вы можете в принципе опустить export так как этот файл читается по умолчанию. Единственная разница возникает, если вы запускаете оболочку с zsh -f, который не содержит никаких RC файлов. Небольшая демонстрация:

% foo=foo_defined
% export bar=bar_defined
% print -l $foo $bar
foo_defined
bar_defined
% zsh -f
% print -l $foo $bar
bar_defined
% 

И. е. только экспортируется $bar определяется в последующих оболочках. Но чтобы быть в безопасности, используйте export - Я не могу вспомнить случай, когда это вредно.

Я не верю, что @mpy правильно, что вы можете опустить оператор экспорта. Наличие / отсутствие экспорта определяет, будут ли процессы, запущенные из этой оболочки, наследовать переменную среды. Если вы не экспортируете, xserver не наследует переменную окружения

 imalison  ~  ABCD='14'
 imalison  ~  python -c "import os; print os.environ.get('ABCD')"
None
 imalison  ~  export ABCD='14'
 imalison  ~  python -c "import os; print os.environ.get('ABCD')"
14
Другие вопросы по тегам