我已将一些目录添加到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/Xsession
zsh
~/.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_path
path