Вопрос или проблема
Спецификация XDG упоминает переменную XDG_CONFIG_HOME
, но не уточняет, где ее следует определить. Нужно ли определять ее в /etc/X11/Xsession
, или это файл конфигурации оконного менеджера, который должен ее определить?
Я пытался объявить ее в /etc/environment следующим образом:
XDG_CONFIG_HOME="$HOME/.config"
но это не сработало, поскольку, похоже, $HOME не определен, когда /etc/environment
обрабатывается.
Единственная документация, которую я смог найти в интернете, была для Gentoo, где она была объявлена в /etc/env.d/90xsession
Я использую Ubuntu. Каково будет общее решение для дистрибутивов на основе Debian?
В Arch Linux это определяется в /etc/profile
, с использованием скрипта в /etc/profile.d
.
Для Debian/Ubuntu, если есть /etc/profile.d
– создайте аналогичный скрипт внутри; если такой директории не существует – редактируйте /etc/profile
.
export XDG_CONFIG_HOME="$HOME/.config"
Файл /etc/environment
обрабатывается pam_env
, который рассматривает его как простые присваивания имя=значение. Однако также есть /etc/security/pam_env.conf
, который поддерживает расширение переменных и может быть использован для этой цели.
Вам не нужно определять это где-либо, если вы не хотите изменить значение по умолчанию.
Спецификация XDG базовой директории четко говорит:
Если
$XDG_CONFIG_HOME
не установлена или пусто, следует использовать значение по умолчанию, равное$HOME/.config
.
Поэтому делить его на значение по умолчанию избыточно. Все совместимые приложения уже будут использовать $HOME/.config
Но если вы действительно хотите изменить значение по умолчанию в системе Debian/Ubuntu, подходящее (но не единственное и, возможно, не лучшее) место следующее:
- Для изменения на уровне системы, затрагивающего всех пользователей:
/etc/profile
- Только для вашего пользователя:
~/.profile
Развивая мысли из других ответов относительно установки переменных на значения по умолчанию:
Если кому-то подходят значения по умолчанию, указанные в спецификации, установка переменных окружения для дублирования запасных значений (т.е. установка $XDG_CONFIG_HOME=$HOME/.config
) не является бессмысленной или глупой. Не каждая программа правильно соблюдает спецификацию, и наличие установленной переменной может значительно упростить копирование и вставку.
Например, NVIDIA использует XDG_CACHE_HOME
, если она установлена, иначе неправильно возвращается к ~/.nv
вместо ~/.cache
. И вы можете легко ждать годы, пока что-то подобное не будет исправлено.
Также, эта страница является отличным местом, чтобы взять кучу переменных окружения, чтобы заставить определенные программы использовать ваши заданные директории. Копирование и вставка 20 из них, а затем исправление пути – это больше работы, чем просто установка переменных XDG.
И чтобы добавить что-то конкретное к исходному вопросу: эта страница содержит информацию о том, где определять переменные.
Я обнаружил, что лучше всего устанавливать переменные окружения через PAM. Для современных дистрибутивов Linux это означает /etc/environment
или $HOME/.pam_environment
(см. man pam_env
). Вы также можете установить их в /etc/security/pam_env.conf
с использованием специального синтаксиса. Вот как я устанавливаю свои переменные XDG в /etc/security/pam_env.conf
.
XDG_CACHE_HOME DEFAULT=@{HOME}/.xdg/cache
XDG_CONFIG_HOME DEFAULT=@{HOME}/.xdg/config
XDG_DATA_HOME DEFAULT=@{HOME}/.xdg/data
XDG_STATE_HOME DEFAULT=@{HOME}/.xdg/state
Ранее я устанавливал эти переменные в /etc/profile.d/custom.sh
. Однако некоторые приложения запускаются до того, как этот файл будет прочитан. Переход на метод PAM решил проблему для нескольких приложений, которые так себя вели.
Для пользователей Zsh определите это в вашем .zshenv
~/.zprofile
файле:
export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
Для Zsh,
я предпочитаю использовать глобальный zshenv напрямую. Указав это значение по умолчанию – $HOME/.config, о котором он должен знать …. – используя параметр замены bash “:=”
cat >> /etc/zsh/zshenv <<- "gnark"
export ZDOTDIR="${XDG_CONFIG_HOME:=$HOME/.config}/zsh"
gnark
Я добавил это в свой файл .zshrc, и это работает.
Ответ или решение
Где следует определять переменную XDG_CONFIG_HOME
Переменная окружения XDG_CONFIG_HOME
, согласно спецификации XDG, используется для указания директории, в которой хранимаются конфигурационные файлы пользователя. Тем не менее, спецификация не устанавливает конкретных местоположений для определения этой переменной, что иногда может вызывать путаницу у пользователей. Давайте рассмотрим наиболее целесообразные варианты определения переменной XDG_CONFIG_HOME, с акцентом на дистрибутивы на базе Debian, такие как Ubuntu.
Обзор XDG_BASE_DIR
Согласно спецификации XDG Base Directory, если переменная XDG_CONFIG_HOME
не установлена или пуста, используется значение по умолчанию — "$HOME/.config"
. Это значит, что если вы не планируете изменять директорию по умолчанию, то нет необходимости явно определять эту переменную.
Определение переменной
Для глобального изменения (для всех пользователей):
-
/etc/profile: Это файл, который выполняется при входе в систему для всех пользователей. Если вы хотите изменить значение
XDG_CONFIG_HOME
для всех аккаунтов на системе, то можно добавить следующую строку в файл/etc/profile
:export XDG_CONFIG_HOME="$HOME/.config"
Если вам требуется установить переменную для определенного окружения, убедитесь, что ваши изменения не конфликтуют с другими скриптами.
-
/etc/profile.d/: Если в вашей системе есть директория
/etc/profile.d/
, вы можете создать собственный файл, например,xdg.sh
, и добавить в него:export XDG_CONFIG_HOME="$HOME/.config"
Это позволит вам организовывать переменные окружения по отдельным файлам, избегая путаницы.
Для пользовательского изменения:
-
~/.profile или ~/.bashrc: Если вам нужно установить
XDG_CONFIG_HOME
только для вашей учетной записи, добавьте соответствующее определение в файл~/.profile
или~/.bashrc
:export XDG_CONFIG_HOME="$HOME/.config"
Это обеспечит доступ к переменной только для вашей учетной записи, не изменяя настройки других пользователей.
Использование PAM для определения переменных
Для более современного подхода к установке переменных окружения вы можете использовать PAM (Pluggable Authentication Modules):
-
/etc/security/pam_env.conf: Этот файл поддерживает синтаксис, который позволяет вам устанавливать переменные окружения с помощью расширения переменных. Например, вы можете добавить:
XDG_CONFIG_HOME DEFAULT=@{HOME}/.config
-
В качестве альтернативы вы также можете определить переменные в файле
~/.pam_environment
.
Подход для Zsh
Если вы используете Zsh, рекомендуется определять переменные в ~/.zprofile
или /etc/zsh/zshenv
:
export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
Этот подход позволяет установить переменную с учетом значения по умолчанию, если она еще не задана.
Заключение
Вопрос о том, где следует определять переменную XDG_CONFIG_HOME
, может зависеть от ваших требований и окружения. Основные рекомендации заключаются в том, чтобы:
- Использовать
/etc/profile
или/etc/profile.d/
для глобальных изменений, которые будут применяться ко всем пользователям. - Для локальных изменений использовать
~/.profile
или~/.bashrc
. - Рассмотреть использование PAM для установки переменных окружения, что может помочь избежать некоторых проблем с инициализацией.
Если ваше приложение или рабочая среда требует специфического поведения, гибкость определения переменных может позволить вам наладить наиболее удобный для вас рабочий процесс.