我正在构建一个命令行应用程序,我需要将一些临时数据保存到文件中。我不知道应用程序在基于 Unix 的系统上存储缓存的惯例是什么(在我的情况下是 Ubuntu 12.0.4)。
答案1
“基于 Unix 的系统”是一个过于笼统的类别,无法做出任何适用于全部基于 Unix 的系统。问题在于,文件系统结构(以及放置东西的“正确”/“常规”位置)在不同的“Unix”(如果你甚至可以这么称呼它)之间差别很大,以至于你几乎必须根据具体情况来处理它。
举几个例子:
- 在 Ubuntu 上,64 位库进入 /usr/lib或者/usr/lib/x86_64-linux/ 和 32 位库进入 /usr/lib32
- 在 Fedora 上,64 位库进入 /usr/lib64,32 位库进入 /usr/lib
- Fedora 不再有 /lib 或 /bin 的概念(它们只是到等效的 /usr 目录的符号链接)
- 最多Linux发行版倾向于将用户安装的软件(即不是由包管理器提供的软件)安装在 /usr/local/ 中(/usr/local/ 中包含 lib、bin、etc、var 等)
- 许多 Linux 发行版使用 /var/cache 作为缓存,但如果它是“暂时的”(即使丢失也没关系),则可以将其存储在 /tmp 中
- 一些“文件夹中的应用程序”类型的应用程序将所有内容存储在 /opt 的子目录中(尤其是点击安装安装程序)
- 有些应用程序只是安装到用户~目录的子目录中(通常是/home/username)
- 在 Solaris 上,我看到 /srv 的用法与 /opt 类似,有时 /srv 是 www-root
答案是规范的、社会可接受的、高度整合的在任何操作系统上,无论是 Linux、BSD、Solaris、HP-UX 等发行版,存储任何东西的约定都是取决于具体情况。 具体来说:
- 该包是如何分发的?
- 用户是否需要 root 权限来安装它?
- 该软件包是否依赖于系统上已有的其他软件包或直接与其集成,例如插件或附加组件?
- 该软件包是否会集成到发行版的上游存储库中,以便用户可以使用类似
apt-get
或的命令yum
直接安装它,而无需从网站下载安装程序? - 该软件是否会针对操作计算机的每个不同用户进行单独的配置?
- 该软件是否具有只能由管理员(root)修改的全局配置设置?
- 该软件是否需要与 init 系统集成(例如,在启动时启动)?
如果不考虑所有因素,就没有直接的答案。然而,对于特别是 Ubuntu 12.04,如果你正在将软件包构建成.deb
要在 PPA 中分发的文件或提交到 Ubuntu 自己的软件包存储库(main
或universe
),我建议将缓存存储在 中/var/cache
。但那是仅适用于 Ubuntu你呢当然不应该假设每个发行版或基于 Unix 的操作系统都会认为这是可以接受的。
此外,如果在系统启动时保存缓存数据没有任何好处,我认为它也可以属于/tmp。
请注意,你将遇到以下路径约定问题每一个程序使用的文件类型:共享数据、可执行文件、库、帮助文件、图像、声音、网页等等。因此,如果您询问的是缓存文件,那么我想知道您打算如何处理其他文件类型。您是否只是在天真地假设并希望没有人反对您?如果您没有阅读任何 Ubuntu 文档或标准来建议将它们放在哪里,那么仅仅假设一件事或另一件事是个坏主意。例如,始终将库放在 /usr/lib 中可能是一个错误,因为根据情况,它们可能属于其他地方。
此外,作为一名软件开发人员,我认为最负责任的做法是允许最终用户决定将文件放在何处。您可以设置默认值,但用户(和分销商)可以并且会自定义版本以适应他们的发行版。
最简单的方法是使用以下方式构建程序GNU Autoconf。Autoconf 是一个构建系统,用户可以将命令行参数传递给构建脚本,以更改各种“目录类型”的路径,使其远离默认值。几乎每个发行版都有一个针对每个 Autoconf 包的构建脚本,用于为每种类型设置适合发行版的常规目录。它们甚至专门为缓存设置了一个目录类型:共享状态目录。
答案2
更通用的答案是查看环境变量TMPDIR
。如果它设置为可写目录的名称,则使用它。否则,使用 /tmp
。
- 在 C 中:
getenv("TMPDIR")
- 在 shell 中:
"$TMPDIR"
参考:
- 维基百科:TMPDIR
- POSIX:环境变量
- GNU / Linux 手册页:mktemp(1), mkstemp(3) 和 临时文件(3)