惯用的 Unix 程序如何检测它们安装在什么前缀下?

Ale*_*x B 5 packaging software-installation

如果我安装一个带有非标准前缀的二进制文件,例如/opt/bin/foo,它需要一些来自 的静态文件/opt/share/foo,它如何找到它们?使用相对于可执行文件 ( ../share/foo) 的反向引用?在编译时硬编码?

应用程序处理可变安装前缀的惯用方式是什么?所有目录都应该加前缀吗?(怎么样/var?)

Gil*_*il' 7

在编译时对此类引用进行硬编码是很常见的,并且可能提供命令行选项或环境变量来覆盖编译时默认值。通常,程序只记住一个配置文件的位置(通常在 下/etc),任何编译时默认值都可以在其中覆盖。这种方法对于由制作操作系统的同一个人编译的开源软件最有意义,作为 Linux 发行版或 BSD 端口的一部分。

对于以二进制形式分发的应用程序,通常的方法是从它的第零个参数定位应用程序二进制文件。按照惯例,execve(ie argv[0])的第零个参数是二进制文件的路径(这取决于调用者,通常是外壳程序,以遵守约定)。如果argv[0]不包含任何/,应用程序应该对其执行$PATH查找。