Kubuntu 14.10,.zshenv 被引用两次

Kubuntu 14.10,.zshenv 被引用两次

我已将一些目录添加到conf 文件$PATH中的变量中~/.zshenv。重启后,我注意到这些路径出现了两次。我尝试打印调用堆栈并得到以下结果:

.zshenv sourced by
18385:/bin/zsh /etc/kde4/kdm/Xsession /usr/bin/startkde
 2158:  -:0
 1438:    kdm
    1:      /sbin/init

.zshenv sourced by
22143:/bin/zsh
20858:  /usr/bin/yakuake -session 10d5e3636b000141388223100000058160027_1415750006_832059
18385:    upstart --user
 2158:      -:0
 1438:        kdm
    1:          /sbin/init

因此,第二个是可以的,因为它是由打开 yakuake 引起的,当时我正在检查$PATH变量。但第一个调用对我来说不清楚。为什么/etc/kde4/kdm/Xsession尝试加载用户的配置?原因是什么?避免$PATH重复的最佳方法是什么?

请不要建议诸如将内容包装.zshenv到首次运行的检查中(又名包括保护)之类的变通方法

答案1

虽然/etc/kde4/kdm/Xsession它实际上用于加载一些用户的 shell 配置,但它实际上不是明确地加载~/.zshenv(尽管注释提到它已加载)。~/.zshenv(以及)每次启动时/etc/zshenv都会自动加载,这无法被覆盖。并且,正如使用您的登录 shell 运行时一样 - 在您的情况下-也会加载,无论在中实际执行了什么。zsh/etc/kde4/kdm/Xsessionzsh~/.zshenv/etc/kde4/kdm/Xsession

/etc/kde4/kdm/Xsession尝试加载用户的配置,以便通过命令行 shell 以外的方式启动的程序(KDE 菜单、自动启动、桌面图标等)可以使用它。


至于防止$PATH重复,这应该可以解决问题:不要使用类似的东西PATH=$PATH:/usr/local/bin:/my/path/here:/another/path,而是使用

new_paths=(/usr/local/bin /my/path/here /another/path)
path=($path ${new_path:|path})

new_path是您要添加的路径的数组。path是的数组版本PATH,它具有相同的内容,但是作为实际数组而不是冒号分隔的列表。由中尚不存在的${new_path:|path}元素的数组替换。new_pathpath

相关内容