Где следует определить переменную XDG_CONFIG_HOME?

Вопрос или проблема

Спецификация 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". Это значит, что если вы не планируете изменять директорию по умолчанию, то нет необходимости явно определять эту переменную.

Определение переменной

Для глобального изменения (для всех пользователей):

  1. /etc/profile: Это файл, который выполняется при входе в систему для всех пользователей. Если вы хотите изменить значение XDG_CONFIG_HOME для всех аккаунтов на системе, то можно добавить следующую строку в файл /etc/profile:

    export XDG_CONFIG_HOME="$HOME/.config"

    Если вам требуется установить переменную для определенного окружения, убедитесь, что ваши изменения не конфликтуют с другими скриптами.

  2. /etc/profile.d/: Если в вашей системе есть директория /etc/profile.d/, вы можете создать собственный файл, например, xdg.sh, и добавить в него:

    export XDG_CONFIG_HOME="$HOME/.config"

    Это позволит вам организовывать переменные окружения по отдельным файлам, избегая путаницы.

Для пользовательского изменения:

  1. ~/.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, может зависеть от ваших требований и окружения. Основные рекомендации заключаются в том, чтобы:

  1. Использовать /etc/profile или /etc/profile.d/ для глобальных изменений, которые будут применяться ко всем пользователям.
  2. Для локальных изменений использовать ~/.profile или ~/.bashrc.
  3. Рассмотреть использование PAM для установки переменных окружения, что может помочь избежать некоторых проблем с инициализацией.

Если ваше приложение или рабочая среда требует специфического поведения, гибкость определения переменных может позволить вам наладить наиболее удобный для вас рабочий процесс.

Оцените материал
Добавить комментарий

Капча загружается...