ZSH:将环境变量放在哪里以便启动的应用程序可以获取它?

ZSH:将环境变量放在哪里以便启动的应用程序可以获取它?

我需要KEY="value"在启动 GUI 应用程序之前为其提供一个环境变量。启动器文件(在 Ubuntu 中将图标放置在桌面和侧边栏上的文件)的值为Exec=/path/to/executable/file

使用 ZSH 时,我应该在哪里定义此变量,以便无论我单击应用程序启动器还是直接在 shell 中键入 /path/to/executable/file,该应用程序都可以使用它?

在我的命令行提示符中,我尝试在单击启动器之前输入KEY="value"export KEY="value",但似乎不起作用。我也在我的 中尝试了这两行~/.zshrc,从我的 shell 中执行了,source ~/.zshrc然后再次单击启动器,但这也不起作用。

它应该放在哪个文件中?我相信可以选择~/.zshenv、、~/.zprofile和。~/.zshrc~/.zlogin

(为了获得加分,我该用export还是不用?)

(当应用程序从启动器启动时,我是否至少需要注销并重新登录,然后变量才可供应用程序使用?)

答案1

因为你希望在终端 shell 中也定义该变量(交互式非登录 shell)以及桌面启动器图标(X 服务器由非交互式登录 shell)你应该把定义放在你的~/.zshenv

是的,您必须重新启动 x 会话才能让新环境可用于您的桌面图标。想象一下这样的启动方案:Graphical Login -> Use your default shell to start the X session -> Desktop -> Shell terminal / Launch program via icon,因此子 shell 会从父 shell 继承环境,该环境用于启动 X 会话。该 shell 只会读取一次 RC 文件 —— 在您登录 X 会话时。

为了加分手册上是这么写的:

export [ name[=value] ... ] 指定的名称被标记为自动导出到随后执行的命令的环境中。(...)

如果您在 中定义变量~/.zshenv,原则上可以省略,export因为默认情况下会读取此文件。唯一的区别在于如果您使用 启动 shell 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在后续 shell 中定义。但为了安全起见,请使用export-- 我想不出这样做有什么危害。

答案2

我认为 @mpy 的说法不正确,你可以省略导出语句。导出的存在与否决定了从该 shell 启动的进程是否会继承环境变量。如果不导出,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

相关内容