目录

XDG 基本目录规范

XDG Base Directory Specification(XDG 基本目录规范)是由 Freedesktop.org 制定,旨在规范应用程序文件的存储路径,解决用户主目录下各种点文件的无序状态。

环境变量(简略版)

变量名 用途 默认值
$XDG_DATA_HOME 存放用户数据文件的基本目录 $HOME/.local/share
$XDG_CONFIG_HOME 存放用户配置文件的基本目录 $HOME/.config
$XDG_DATA_DIRS 用户数据文件基本目录的搜索路径,多个路径以冒号(:)分隔 usr/local/share:/usr/share/
$XDG_CONFIG_DIRS 用户配置文件基本目录的搜索路径,多个路径以冒号(:)分隔 /etc/xdg
$XDG_CACHE_HOME 存放用户缓存文件的基本目录 $HOME/.cache
$XDG_RUNTIME_DIR 存放用户运行时文件(如 sockets, named pipes)的基本目录,该目录的权限必须是 0700

基本目录规范

XDG 基本目录规范包含以下概念:

  • XDG_DATA_HOME 下存放用户数据文件,默认值是 ~/.local/share
  • XDG_CONFIG_HOME 下存放用户配置文件,默认值是 ~/.config
  • XDG_DATA_DIRS 定义一组以 : 分隔的有序目录集,规定了除 XDG_DATA_HOME 外的搜索路径,默认值是 usr/local/share:/usr/share/
  • XDG_CONFIG_DIRS 定义一组以 : 分隔的有序目录集,规定了除 XDG_CONFIG_HOME 外的搜索路径,默认值是 /etc/xdg
  • XDG_CACHE_HOME 下存放用户的缓存文件,默认值是 ~/.cache
  • XDG_RUNTIME_DIR 下存放运行时的用户文件,比如 sockets、named pipes。此目录必须属于该用户,并且他必须是用户中唯一拥有读/写操作的以为,换句话说便是 0700 权限

对于 XDG_CONFIG_DIRS(XDG_DATA_DIRS) 来说,顺序代表了这些目录的重要性,第一个列出的目录是最重要的

另外如果尝试写入文件时,目标目录不存在,那么应当尝试使用 0700 权限创建目标目录;如果目标目录已经存在,则不能对权限进行修改。应用程序应当能够处理无法写入文件的情况,可以直接向用户呈现错误信息。如果读取文件时,因为某种原因目录中的文件不可访问。比如目录不存在,文件不存在或者用户没有权限。那么应当跳过此文件,如果因此无法找到所需的文件,则应当向用户呈现错误信息。如果文件同时位于 XDG_CONFIG_DIRS(XDG_DATA_DIRS) 中的多个目录,那么应用应当定义处理此种情况的行为,比如仅使用最重要的目录中的文件,或者定义一个规则去合并这些位于不同目录中的文件

Example 以 pip 为例,它是符合 XDG Base Directory Specification 的。如果想要知道它如果获取配置的,我们可以阅读文档或者源代码。这里另外给出一个角度,读取配置文件首先需要通过 open 系统调用去打开文件。那么可以便通过 strace 去跟踪一下它

1
2
3
4
5
➜ strace -e trace=open pip 2>&1 | grep "pip.conf"
open("/etc/xdg/pip/pip.conf", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/pip.conf", O_RDONLY)         = -1 ENOENT (No such file or directory)
open("/home/sapphire/.pip/pip.conf", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/home/sapphire/.config/pip/pip.conf", O_RDONLY) = -1 ENOENT (No such file or directory)

最后说一点,配置文件通常命名为

1
2
3
1) ~/.ansible.cfg /etc/pacman.conf
2) ~/.stack/config.yaml  ~/.rustup/settings.toml
3) wgetrc vimrc bashrc

其实 vimrc 和 bashrc 应当不属于配置文件的范畴,因为他们是一个初始化脚本。rc 即是 “run commands” 的意思。但这里比较奇怪的是 wgetrc 中的内容却看起来想一个普通的配置文件

参考

https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

https://iguoli.github.io/2020/06/06/XDG-Base-Directory-Specification.html

http://blog.dreamfever.me/2018/08/17/xdg-base-directory-specification/