Linux/Unix中ini/config文件的位置在哪里?

81

实际上是两个问题:

  1. 有没有关于配置文件放置位置的标准或惯例?对于系统或类似系统的程序,它们通常位于 /etc 中的某个位置。但对于普通应用程序或权限不足的程序,似乎不太清楚该放在哪里。

  2. 在处理程序选项时,是否存在优先级层次结构的标准?例如,命令行选项是否会覆盖初始化文件和/或环境变量?反之亦然?还是完全由开发人员决定?

7个回答

198
你应该遵守XDG基础目录规范。这里的大多数答案都已经过时或不正确。
你的应用程序应该将数据和配置文件存储到以下环境变量指定的目录中进行读写:
  • $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"):用户特定的非必需数据文件。
你应该首先确定所涉及的文件是:
  1. 配置文件($XDG_CONFIG_HOME:$XDG_CONFIG_DIRS);
  2. 数据文件($XDG_DATA_HOME:$XDG_DATA_DIRS);或
  3. 非必需(缓存)文件($XDG_CACHE_HOME)。
建议你的应用程序将其文件放在上述目录的子目录中。通常是像$XDG_DATA_DIRS/<application>/filename或者$XDG_DATA_DIRS/<vendor>/<application>/filename这样的形式。

加载文件时,首先尝试从用户特定目录($XDG_*_HOME)加载文件,如果失败,则从系统目录($XDG_*_DIRS)加载。保存时仅保存到用户特定目录(因为用户可能没有写入系统目录的权限)。

对于其他更加用户导向的目录,请参考XDG User Directories Specification。它定义了桌面、下载、文档、视频等目录。


5
我看到那个规范是由freedesktop.org制定的,该组织致力于为“X Window系统桌面”实现互操作性和共享技术。我不确定什么是“X Window系统桌面”,但即使在X11.app中,xterm也没有这些环境变量。因此,这个答案并不适用于所有的Unix系统。 - Rory O'Kane
10
对于那些提到这些变量并非总是被定义的人,需要注意的是,如果这些变量不存在,则应使用指定的默认值。例如,在 shell 脚本中,您可以在脚本的顶部添加 : ${XDG_CONFIG_HOME:=$HOME/.config},然后 $XDG_CONFIG_HOME 将被设置为用户环境中的值,如果没有设置任何值,则为 $HOME/.config - Brian Campbell
1
如果你正在编写跨平台的程序,针对Windows操作系统,你应该将$HOME回退到$USERPROFILE$APPDATA,并且$XDG_DATA_DIRS指向:$APPDATA:$PROGRAMDATA - Tracker1
1
@RoryO'Kane 我相信Brian Campbell已经回答了你的问题。你应该检查$XDG_CONFIG_HOME等是否已定义,如果是,则使用它们,否则使用默认值来定义它们。 - Jorge Bucaran
1
作为一个提示,我想指出$XDG_DATA_DIRS$XDG_CONFIG_DIRS指定了要搜索文件的附加目录,而$XDG_DATA_HOME$XDG_CONFIG_HOME则是默认被搜索的。我认为这一点可能会有些令人困惑。 - Steve Benner
显示剩余7条评论

73
  1. 通常系统/全局配置存储在 /etc 目录下。
  2. 用户特定的配置存储在用户的主目录下,通常作为隐藏文件,有时是包含非隐藏文件(及可能更多子目录)的隐藏目录。

一般来说,命令行选项会覆盖环境变量,后者又会覆盖用户默认值,最后覆盖系统默认值。


1
+1非常简单明了的解释。 虽然有些设置不会将其配置文件放置在/ etc中,而是仅在主目录中进行。这高度取决于具体应用程序的类型。 - Elitecoder
17
GUI 应用程序似乎开始使用 $HOME/.config 目录来存储每个应用程序、每个用户的配置文件,这使得主目录更加整洁,也更容易备份你的配置文件。 - camh

40

新应用程序

遵循XDG基本目录规范,通常将~/.config/yourapp/*用作INF、JSON、YML或任何您喜欢的格式,以及任何文件... yourapp应与您的可执行文件名称匹配,或命名空间化为您的组织/公司/用户名/句柄到~/.config/yourorg/yourapp/*

旧应用程序

每个用户的配置通常位于您的主目录中...

  • 单个文件可以使用~/.yourapp
  • 多个文件和数据通常在~/.yourapp/config中使用~/.yourapp/

全局配置通常位于/etc/appname文件或/etc/appname/目录。

全局应用程序数据:/var/lib/yourapp/

缓存数据:/var/cache/

日志数据:/var/log/yourapp/


来自tutorialhelpdesk.com的一些附加信息

Linux/其他类Unix系统的目录结构及其详细信息。

在Windows中,几乎所有程序都将其文件(所有文件)安装在名为:“Program Files”的目录中。但在Linux中情况并非如此。目录系统将所有安装的文件进行分类。所有配置文件都在/etc中,所有二进制文件都在/bin/usr/bin/usr/local/bin中。以下是整个目录结构以及它们包含的内容:

/ - 根目录,是文件系统的基础。无论实际位置如何,所有文件和目录逻辑上都包含在根目录中。

/bin - 包含 Linux 操作系统的可执行程序。许多 Linux 命令,例如 cat、cp、ls、more 和 tar,位于 /bin 目录中。

/boot - 包含 Linux 内核和 LILO 和 GRUB 引导管理器所需的其他文件。

/dev - 包含所有设备文件。Linux 将每个设备视为特殊文件。所有这些文件都位于 /dev 目录中。

/etc - 包含大部分系统配置文件和 /etc/rc.d 子目录中的初始化脚本。

/home - 家目录是各用户家目录的父目录。

/lib - 包含库文件,包括启动系统所需的可加载驱动模块。

/lost+found - 丢失文件的目录。每个磁盘分区都有一个 lost+found 目录。

/media - 用于挂载可移动介质上的文件系统,如 CD-ROM 驱动器、软盘和 Zip 驱动器。

/mnt - 临时挂载文件系统的目录。

/opt - 可选软件包将文件复制/安装到此处。

/proc - 虚拟文件系统中的特殊目录。它包含有关 Linux 系统各方面的信息。

/root - root 用户的家目录。

/sbin - 包含管理二进制文件。例如挂载、关机和卸载命令位于此处。

/srv - 包含由系统提供的服务(如 HTTP、FTP 等)的数据。

/sys - 包含有关设备的信息,如 Linux 内核所看到的信息。

/tmp - 临时目录,可用作暂存目录(存储临时文件)。该目录的内容在系统重新启动时清除。

/usr - 包含许多程序的子目录,例如X Window系统。

/usr/bin - 包含许多Linux命令的可执行文件。它不是Linux核心操作系统的一部分。

/usr/include - 包含C和C ++编程语言的头文件。

/usr/lib - 包含C和C ++编程语言的库。

/usr/local - 包含本地文件。它有与 /usr 相似的目录。

/usr/sbin - 包含管理命令。

/usr/share - 包含共享文件,如默认配置文件、图像、文档等。

/usr/src - 包含Linux内核的源代码。

/var - 包含各种系统文件,例如日志、邮件目录、打印池等,这些文件的数量和大小随时间而变化。

/var/cache - 存储应用程序缓存数据的区域。

/var/lib - 包含与应用程序当前状态相关的信息。程序运行时会修改此信息。

/var/lock - 包含锁文件,应用程序会检查这些文件,以便资源只能被一个应用程序使用。

/var/log - 包含不同应用程序的日志文件。

/var/mail - 包含用户的电子邮件。

/var/opt - 包含存储在 /opt 目录中的软件包的可变数据。

/var/run - 包含描述系统自启动以来的数据。

/var/spool - 包含等待某种类型处理的数据。

/var/tmp - 包含在系统重新启动之间保留的临时文件。



3
  1. 通常在用户主目录下的点文件(如.myprogramrc)中。
  2. 当然由程序员决定,但通常命令行参数会覆盖其他所有设置。如果使用环境变量,则通常作为命令行参数的替代方案或指定配置文件所在位置的另一种选择。

2

针对用户配置,我注意到趋势是从个人的~/.myprogramrc向下一级结构~/.config转移。例如,Qt 4使用~/.config/<vendor>/<programname>作为QSettings的默认设置。主要的桌面环境KDE和Gnome也使用特定文件夹下的文件结构(不确定KDE 4是否使用~/.config,XFCE确实使用~/.config)。


4
你所看到的是 XDG 基础目录规范,http://standards.freedesktop.org/basedir-spec/latest/。 - CesarB

1

(1) 不行(很遗憾)编辑:其他答案是正确的,每个用户的配置通常存储在用户主目录中的点文件或点目录中。任何高于用户级别的设置通常都需要猜测。

(2) 系统范围的ini文件 -> 用户ini文件 -> 环境变量 -> 命令行选项(从最低到最高优先级)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接