Я добавил некоторые каталоги в $PATH
переменная в моем ~/.zshenv
файл conf. После перезагрузки я заметил, что эти пути появляются дважды. Я попытался распечатать стеки вызовов и получил следующее:
.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
в проверки на первый показ (иначе включают защиту),
Хотя /etc/kde4/kdm/Xsession
на самом деле используется для загрузки некоторых конфигураций оболочки пользователя, это на самом деле не загружается ~/.zshenv
явно (хотя комментарий упоминает, что загружается). ~/.zshenv
(а также /etc/zshenv
) загружаются автоматически каждый раз a zsh
запускает, это не может быть переопределено. И как /etc/kde4/kdm/Xsession
выполняется с Вашей оболочкой входа в систему - в Вашем случае zsh
- ~/.zshenv
загружается также в независимо от того, чем на самом деле выполняют /etc/kde4/kdm/Xsession
.
И /etc/kde4/kdm/Xsession
попытки загрузить конфигурацию пользователя так, чтобы это было доступно программам, которые запущены через средства кроме оболочки командной строки (меню 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
.