我需要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