3

Мне нужна переменная окружения 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 ответа2

4

Поскольку вы хотите, чтобы переменная была также определена в оболочках вашего терминала (интерактивная оболочка без входа в систему) и для значков панели запуска на рабочем столе (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 - я не могу вспомнить случай, когда это вредно.

0

Я не верю, что @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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .