【问题标题】:Location of ini/config files in linux/unix?ini/config 文件在 linux/unix 中的位置?
【发布时间】:2010-11-04 16:16:29
【问题描述】:

两个问题,真的:

  1. 是否有关于配置文件放置的标准/约定?

    对于系统或准系统程序,它们似乎通常位于/etc 的某个位置。对于普通应用程序或/etc 权限不足的程序似乎不太清楚。

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

【问题讨论】:

    标签: linux unix configuration


    【解决方案1】:

    您的申请应遵守 XDG Base Directory Specification。这里的大多数答案要么已过时,要么错误。

    您的应用程序应在以下环境变量指向的目录中存储和加载数据和配置文件:

    • $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。它定义了桌面、下载、文档、视频等的目录。

    【讨论】:

    • 我看到该规范是由freedesktop.org 编写的,它适用于“X Window System 桌面的互操作性和共享技术”。我不确定“X Window System 桌面”到底是什么,但即使是X11.app 中的 xterm 也没有这些环境变量。所以这个答案并不适用于所有的 Unix。
    • 提醒那些提到这些变量并不总是定义的人,如果这些变量不存在,那么您应该使用指定的默认值。例如,在 shell 脚本中,您可以在脚本顶部添加 : ${XDG_CONFIG_HOME:=$HOME/.config,然后将 $XDG_CONFIG_HOME 设置为用户环境中的值,如果未设置值,则设置为 $HOME/.config
    • 如果您正在编写跨平台的 Windows 应用程序,您应该将 $HOME 回退到 $USERPROFILE$APPDATA$XDG_DATA_DIRS 指向 :$APPDATA:$PROGRAMDATA
    • @RoryO'Kane 我相信 Brian Campbell 会回答你的问题。您应该检查是否定义了 $XDG_CONFIG_HOME 等,如果是则使用它们,否则使用默认值定义它们。
    • 作为提示,我想指出$XDG_DATA_DIRS$XDG_CONFIG_DIRS 指定附加 目录来搜索文件,$XDG_DATA_HOME 和@987654354 @ 本质上是搜索的。我认为这一点可能有点令人困惑。
    【解决方案2】:
    1. 通常系统/全局配置存储在 /etc 下的某处。
    2. 用户特定的配置存储在用户的主目录中,通常作为隐藏文件,有时作为包含非隐藏文件(可能还有更多子目录)的隐藏目录。

    一般来说,命令行选项会覆盖环境变量,这些环境变量会覆盖用户默认值,而用户默认值会覆盖系统默认值。

    【讨论】:

    • +1 非常简单准确的解释。尽管某些设置不会将其配置文件放在 /etc 中,但它们仅将其放在主目录中。很大程度上取决于特定类型的应用程序。
    • GUI 应用程序似乎开始使用 $HOME/.config 作为目录来存储每个应用程序、每个用户的配置文件。使主目录更整洁,更容易备份您的配置。
    【解决方案3】:

    较新的应用程序

    关注XDG Base Directory Specification 通常~/.config/yourapp/* 可以是INF、JSON、YML 或任何格式,以及任何文件...yourapp 应该与您的可执行文件名称匹配,或者使用您的组织/公司/用户名命名/句柄到~/.config/yourorg/yourapp/*

    旧应用程序

    每个用户的配置,通常就在您的主目录中...

    • ~/.yourapp 单个文件的文件
    • ~/.yourapp/ 用于多个文件 + 数据通常在 ~/.yourapp/config

    全局配置一般在/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 - 包含 LILO 和 GRUB 引导管理器所需的 Linux 内核和其他文件。

    /dev - 包含所有设备文件。 Linux 将每个设备视为一个特殊文件。所有此类文件都位于/dev

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

    /home - 主目录是用户主目录的父目录。

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

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

    /media - 用于在 CD-ROM 驱动器、软盘和 Zip 驱动器等可移动媒体上安装文件系统的目录。

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

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

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

    /root - root 用户的主目录。

    /sbin - 包含管理二进制文件。 mount、shutdown、umount 等命令驻留在此处。

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

    /sys - 一个包含设备信息的特殊目录,如 Linux 内核所见。

    /tmp - 临时目录,可用作临时目录(临时文件的存储)。每次系统启动时都会清除该目录的内容。

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

    /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 - 包含在系统重新启动之间保留的临时文件。

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:
        1. 通常在用户主目录中的点文件(如 .myprogramrc)中。
        2. 这当然取决于程序员,但通常命令行参数会覆盖其他所有参数。如果使用环境变量,它通常可以替代命令行参数或指定配置所在的位置。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            猜你喜欢
            • 2011-05-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-17
            • 2013-02-14
            • 2012-03-12
            • 1970-01-01
            • 2018-03-07
            • 2012-03-11
            相关资源
            最近更新 更多