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