XDG Base Directory Specification(XDG 基本目录规范)
ssk-wh Lv4

原文链接:https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

介绍

各种指定文件和文件格式的规范。本规范通过定义一个或多个相对于文件所在位置的基本目录来定义应在何处查找这些文件。

基础

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

  • 有一个单一的基本目录,用户特定的数据文件应该写入该基本目录。该目录由环境变量定义$XDG_DATA_HOME
  • 有一个单一的基本目录,用户特定的配置文件应该写到这个目录中。该目录由环境变量定义$XDG_CONFIG_HOME
  • 有一个单一的基本目录,用户特定的状态数据应该写入该目录。该目录由环境变量定义$XDG_STATE_HOME
  • 有一个单一的基本目录,用户特定的可执行文件可以相对于该目录写入。
  • 有一组优先排序的基本目录,数据文件应根据这些目录进行搜索。这组目录由环境变量定义$XDG_DATA_DIRS
  • 有一组优先排序的基本目录,配置文件应该根据这些目录进行搜索。这组目录由环境变量定义$XDG_CONFIG_DIRS
  • 有一个相对于用户特定的非必要(缓存)数据应该写入的单一基本目录。该目录由环境变量定义$XDG_CACHE_HOME
  • 有一个单一的基本目录,用户特定的运行时文件和其他文件对象应该相对于该目录放置。该目录由环境变量定义$XDG_RUNTIME_DIR

这些环境变量中设置的所有路径都必须是绝对路径。如果实现(指实现此规范的角色,常指桌面环境和其发行商)在任何这些变量中遇到相对路径,它应该认为该路径无效并忽略它。

环境变量

$XDG_DATA_HOME定义应存储用户特定数据文件的基本目录。如果 $XDG_DATA_HOME未设置或为空, $HOME则应使用等于 /.local/share 的默认值。

$XDG_CONFIG_HOME定义应存储用户特定配置文件的基本目录。如果 $XDG_CONFIG_HOME未设置或为空, $HOME则应使用等于 /.config 的默认值。

$XDG_STATE_HOME定义应存储用户特定状态文件的基本目录。如果 $XDG_STATE_HOME未设置或为空, $HOME则应使用等于 /.local/state 的默认值。

$XDG_STATE_HOME包含应在(应用程序)重新启动之间持续存在的状态数据,但对于用户而言,这些数据不重要或可移植性不够,因此应将其存储在$XDG_DATA_HOME. 它可能包含:

  • 操作历史记录(日志、历史记录、最近使用的文件……)
  • 可以在重新启动时重复使用的应用程序的当前状态(视图、布局、打开的文件、撤消历史记录……)

用户特定的可执行文件可能存储在 $HOME/.local/bin 中。发行版应确保此目录显示在 UNIX$PATH 环境变量中的适当位置。

由于$HOME可能在不同体系结构的系统之间共享,因此将编译后的二进制文件安装到 $HOME/.local/bin 可能会在不同体系结构的系统上使用时导致问题。这通常不是问题,但 $HOME如果将已编译的二进制文件放入其中,就会变得部分特定于体系结构,这点需要注意。

$XDG_DATA_DIRS定义优先排序的基本目录集,以搜索除 $XDG_DATA_HOME基本目录之外的数据文件。中的目录$XDG_DATA_DIRS应以冒号“:”分隔。

如果$XDG_DATA_DIRS未设置或为空,则应使用等于 /usr/local/share/:/usr/share/ 的值。

$XDG_CONFIG_DIRS定义优先排序的基本目录集,以搜索除 $XDG_CONFIG_HOME基本目录之外的配置文件。中的目录$XDG_CONFIG_DIRS应以冒号“:”分隔。

如果$XDG_CONFIG_DIRS未设置或为空,则应使用等于 /etc/xdg 的值。

基本目录的顺序表示它们的重要性;列出的第一个目录是最重要的(优先级更高的)。当在多个地方定义相同的信息时,相对重要的基目录(Base Directory)定义的信息更优先。定义的基目录$XDG_DATA_HOME被认为比$XDG_DATA_DIRS定义的任何基目录都重要。定义的基目录$XDG_CONFIG_HOME被认为比$XDG_CONFIG_DIRS定义的任何基目录都重要。

$XDG_CACHE_HOME定义应存储用户特定的非必要数据文件的基本目录。如果 $XDG_CACHE_HOME未设置或为空, $HOME则应使用等于 /.cache 的默认值。

$XDG_RUNTIME_DIR定义基本目录,用户特定的非必要运行时文件和其他文件对象(例如套接字、命名管道…)应该存储在该目录中。该目录必须由用户拥有,并且他必须是唯一具有读写权限的人。它的 Unix 访问模式必须是 0700。

目录的生命周期必须绑定到正在登录的用户。它必须在用户首次登录时创建,如果用户完全注销,则目录必须被删除。如果用户多次登录,他应该指向同一个目录,并且该目录必须从他第一次登录到他最后一次注销系统继续存在,并且在这期间不会被删除。目录中的文件不得在重启或完整的注销/登录周期后继续存在。

该目录必须位于本地文件系统上,并且不与任何其他系统共享。该目录必须完全符合操作系统的标准。更具体地说,在类 Unix 操作系统上 AF_UNIX 套接字、符号链接、硬链接、适当的权限、文件锁定、稀疏文件、内存映射、文件更改通知,必须支持可靠的硬链接计数,并且对文件名没有限制应该强加字符集。此目录中的文件可能会定期清理。为确保您的文件不被删除,他们应该至少每 6 小时的单调时间修改一次他们的访问时间戳,或者应该在文件上设置“粘性”位。

如果$XDG_RUNTIME_DIR未设置,应用程序应回退到具有类似功能的替换目录并打印一条警告消息。应用程序应该将此目录用于通信和同步目的,并且不应在其中放置较大的文件,因为它可能驻留在运行时内存中并且不一定要换出到磁盘。

参考

其他规范可以通过将数据文件的位置指定为 $XDG_DATA_DIRS/subdir/filename 来引用此规范。这意味着:

  • 此类文件应安装到$datadir/subdir/filename,$datadir默认为 /usr/share。
  • 可以在 $XDG_DATA_HOME /subdir/filename 中创建数据文件的用户特定版本,如果 $XDG_DATA_HOME未设置则使用其默认值。
  • 数据文件的查找应该搜索相对于$XDG_DATA_HOME$XDG_DATA_DIRS指定的所有基本目录的 ./subdir/filename 。如果环境变量未设置或为空,则应使用本规范定义的默认值。

规范可以通过将配置文件的位置指定为 $XDG_CONFIG_DIRS/subdir/filename 来引用此规范。这意味着:

  • 默认配置文件应安装到$sysconfdir/xdg/subdir/filename,$sysconfdir默认为 /etc。
  • 配置文件的用户特定版本可以在 $XDG_CONFIG_HOME/subdir/filename 中创建,如果 $XDG_CONFIG_HOME未设置则使用其默认值。
  • 配置文件的查找应该搜索相对于$XDG_CONFIG_HOME$XDG_CONFIG_DIRS指示的所有基本目录的 ./subdir/filename 。如果环境变量未设置或为空,则应使用本规范定义的默认值。

如果在尝试写入文件时目标目录不存在,则应尝试使用权限创建它0700。如果目标目录已经存在,则不应更改权限。应用程序应该准备好处理无法写入文件的情况,这可能是因为目录不存在且无法创建,也可能是出于任何其他原因。在这种情况下,它可能会选择向用户显示一条错误消息。

当试图读取文件时,如果某个目录中的文件由于任何原因不可访问,例如因为目录不存在,文件不存在或用户无权打开文件,则处理应该跳过该目录中的文件。如果因此根本找不到所需的文件,应用程序可能会选择向用户显示一条错误消息。

当文件位于多个基本目录下(如$XDG_DATA_DIRS$XDG_CONFIG_DIRS中均存在)时, 规范应该定义此时的行为。例如,它可以定义仅应使用最重要的基本目录下的文件,或者,作为另一个示例,它可以定义合并来自不同文件的信息的规则(取不同文件内容的并集,冲突之处以高优先级文件内容为准)。

 Comments