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

7539
user779159

Мне нужна переменная среды, 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или нет?)

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

3

2 ответа на вопрос

4
mpy

As you want the variable to be defined as well in your terminal shells (interactive non-login shell) and for the desktop launcher icons (X-server started by non-interactive login shell) you should put the definition in your ~/.zshenv.

And yes, you have to restart your x-session in order to have the new environment available for your desktop icons. Imagine such a startup scheme: Graphical Login -> Use your default shell to start the X session -> Desktop -> Shell terminal / Launch program via icon, so the child shells inherit the environment from the parent, which is used to start the X session. That shell read the RC-files only once -- on your login to the X session.

For the bonus point. This is what the manual says:

export [ name[=value] ... ] The specified names are marked for automatic export to the environment of subsequently executed commands. (...)

If you define your variable in ~/.zshenv, you can in principle omit the export as this file is read in by default. The only difference arises if you start a shell with zsh -f, which sources no RC files. A little demonstration:

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

I. e. only the exported $bar is defined in subsequent shells. But to be on the safe side, use export -- I can't think of a case where this is harmful.

Под оболочкой по умолчанию вы подразумеваете тот, что находится в / etc / passwd? Допустим, кто-то использует bash в качестве оболочки по умолчанию, но gnome-терминал настроен на автоматическое открытие в ZSH. В таком случае .zshenv будет прочитан при запуске? Если нет, есть ли независимый от оболочки файл, который можно использовать для размещения переменных вроде этого? (Я знаю, что есть такие вещи, как ~ / .profile и ~ / .pam_environment, описанные по адресу https://help.ubuntu.com/community/EnvironmentVariables, но как они вписываются в ваш ответ ~ / .zshenv?) user779159 10 лет назад 0
@ user779159: Да, под _default shell_ я имел в виду тот, который определен в `/ etc / passwd`. `zshenv` специфичен для` zsh`, поэтому не читается `bash`,` csh` или чем-то еще. Мой ответ применяется только к `zsh`, согласно вашему тегу вопроса. В неоднородной установке (оболочка по умолчанию, отличная от оболочки gnome-Terminal) возможности в вашей ссылке кажутся разумными. Я бы поместил переменную в `~ / .profile` и сделал` zsh` в gnome-Terminal _login shell_, используя `zsh -l` в качестве команды запуска. mpy 10 лет назад 0
0
imalison

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

Похожие вопросы