XDG_CONFIG_HOME 变量应该在哪里定义?

NOL*_*tMe 57 debian xdg

XDG 规范讨论了XDG_CONFIG_HOME变量,但没有指定应该在哪里定义它。我们应该在 中定义它/etc/X11/Xsession,还是需要定义它的窗口管理器的配置文件?

我尝试在 /etc/environment 中将其声明为

XDG_CONFIG_HOME="$HOME/.config"
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为似乎 $HOME 在/etc/environment解析时没有定义。

我在网上能找到的唯一文档是关于 Gentoo 的,它在 /etc/env.d/90xsession

我正在使用 Ubuntu。基于 Debian 的发行版的通用解决方案是什么?

Mes*_*ion 74

不需要在任何地方定义它,除非您想更改默认值。

XDG 基本目录规范明确指出:

如果$XDG_CONFIG_HOME未设置或为空,$HOME/.config则应使用默认值等于 。

所以将其定义为默认值是多余的。所有兼容的应用程序都将使用$HOME/.config

但是,如果您确实想更改 Debian/Ubuntu 系统中的默认设置,最好的位置是:

  • 对于系统范围的更改,影响所有用户: /etc/profile
  • 仅适用于您的用户: ~/.profile

  • @ManuelSchneid3r 非常正确,但是对于这样的软件设置,`XDG_CONFIG_HOME` 无论如何都没有什么区别,如果有的话。 (6认同)
  • 可能有些软件不遵守规范就盲目使用`XDG_CONFIG_HOME`,假设它是标准的 Linux 甚至 Unix 功能,而不是第三方规范的一部分。 (5认同)
  • 从理论上讲,这个答案非常好,但是周围有很多软件,它们不符合 XDG 基本目录规范,并且由于这种无知而产生了 quattuordecillion 的错误。 (4认同)
  • @mcnesium 我是说它可能不会受伤。尽管如果可能,最好修复应用程序本身并将修复程序发送到上游。 (3认同)
  • FWIW,byobu 使用 `XDG_CONFIG_HOME` 但不会回退到 `$HOME/.config`。想想采用“XDG_CONFIG_HOME”但希望保持向后兼容的程序。 (3认同)
  • @TorstenBronger:“向后兼容”_什么_?在 XDG 之前,主目录没有标准,`~/.appname` 只是一个(糟糕的)约定。如果在未设置“XDG_CONFIG_HOME”时 byobu 回退到“~/.appname”,那么它就是“严重”滥用 XDG 标准及其变量,应该予以修复。 (2认同)

use*_*686 33

在 Arch Linux 中,这是由/etc/profile, 使用/etc/profile.d脚本定义的。

对于 Debian/Ubuntu,如果有/etc/profile.d- 在里面创建一个类似的脚本;如果这样的目录不存在 - 编辑/etc/profileitsef。

export XDG_CONFIG_HOME="$HOME/.config"
Run Code Online (Sandbox Code Playgroud)

/etc/environment文件由 解析pam_env,它将其视为简单的 name=value 分配。但是,它也有/etc/security/pam_env.conf,它支持变量扩展并可用于此目的。

  • 它不再在 Arch 的 `/etc/profile` 中,并且只在 `/etc/profile.d/locale.sh` 中提到过一次。 (5认同)

car*_*rge 9

我发现通过 PAM 设置环境变量效果最好。对于现代 Linux distos,这意味着/etc/environment$HOME/.pam_environment(请参阅参考资料man pam_env)。您还可以/etc/security/pam_env.conf使用特殊语法设置它们。这是我在/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
Run Code Online (Sandbox Code Playgroud)

以前我会在/etc/profile.d/custom.sh. 但是,某些应用程序会在读取该文件之前启动。切换到 PAM 方法解决了多个以这种方式运行的应用程序的问题。

  • 注意:这不遵循 [XDG 基本目录规范](https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html) 中指定的默认值 (7认同)
  • @TomHale 规范没有定义 _operating system_ 应该将变量设置为什么;它定义了变量,如果定义并且非空, _application_ 应该使用。如果变量未定义或为空,则 _application_ 应使用规范中引用的默认路径。因此,您的简短示例不符合规范,因为它不会首先检查“XDG_CACHE_HOME”是否已定义且非空。它应该是:`export LESSHISTFILE="${XDG_CACHE_HOME:-$HOME/.cache}"/less/history` (4认同)
  • 如果我想`export LESSHISTFILE="$XDG_CACHE_HOME"/less/history`,其中`less` 不了解规范并且我的发行版尚未设置默认值,这很重要。 (3认同)
  • @TomHale 当然不是,设置变量的重点是覆盖默认值。如果您对默认值感到满意,那么您根本不需要设置这些变量。 (2认同)

小智 5

好吧,显然我需要 50 声望才能发表评论。这个问题已经得到了很好的回答,所以我希望这可以帮助人们阅读这里的评论。

特别是关于将变量设置为回退值。如果规范中规定的回退值没有问题,那么设置环境变量以复制回退(即:设置 $XDG_CONFIG_HOME=$HOME/.config)并不是毫无意义或愚蠢的。并非每个程序都会正确地遵循规范,并且设置变量可以使复制和粘贴更容易。

例如,NVIDIA 使用 XDG_CACHE_HOME 如果设置,否则不正确地回退到 ~/.nv 而不是 ~/.cache。您可以轻松地等待数年才能修复此类问题。

此外,https://wiki.archlinux.org/index.php/XDG_Base_Directory是获取一堆环境变量以强制某些程序使用您定义的目录的好地方。复制和粘贴其中的 20 个,然后设置调整路径比必须设置 XDG 变量要多得多。

并添加一些特定于原始问题的内容:https : //wiki.archlinux.org/index.php/Environment_variables#Defining_variables包含有关在何处定义变量的信息。