在我看来,对于不同的 Linux/Unix 发行版之间不同的文件系统是如何构建的,存在很多困惑(或者至少在我看来)。
按理说,与其为每个系统使用不同类型的包,不如让环境变量指向各个文件系统结构中的不同目录会更有用。
例如:如果我想知道 Windows 系统上“程序文件”目录的位置,我可以使用环境变量%ProgramFiles%
或%ProgramFiles(x86)%
. Linux 或 Unix 系统上有这样的工具吗?
答案1
Linux 没有与 Windows 等效的%ProgramFiles%
变量,因为它不需要它。安装在其自己目录中的程序有一个标准位置:/opt
。大多数程序都没有安装在那里,因为它们是在包中,并且它们的文件位于其他程序可以找到的位置。 Windows 拥有变量的原因%ProgramFiles%
实际上很大程度上是历史原因:
- Windows 有驱动器号。即使
\Program Files
是标准位置,仍然存在是否是 、 等问题c:\Program Files
。LinuxD:\Program Files
从来没有这个问题,因为符号链接允许目录出现在任何地方,无论它位于哪种物理存储介质上。 (现代 Windows 不需要这个,因为它们具有等效的功能,但该位置仍然可以修改以实现向后兼容性。) - Windows 允许管理员选择系统目录的名称。 Linux 没有;这没关系,因为它从来没有这样做过,而 Windows 必须适应选择不同位置以实现向后兼容性的管理员。
- 每个 Windows 程序都带有自己的安装程序,因此没有真正的包管理机制,跟踪哪些文件属于哪个包的唯一方法是每个目录都有一个包。这种情况已经开始改变,但还没有完全改变。相比之下,Linux 通常将文件存储在可以找到的位置并让包管理器跟踪它们属于谁。
Linux 确实有指定路径的环境变量:PATH
可执行命令、LD_LIBRARY_PATH
共享库、MANPATH
手册页等。它们都是关于在哪里寻找文件,而不是去哪里放文件。文件存放在哪里并不是什么问题程式知道,这是一个东西包管理器知道。包管理器有他们的数据文件,他们不需要环境变量来告诉他们东西在哪里。
Linux 系统上的目录结构标准化为文件系统层次结构标准。其中大多数不需要环境变量,要么因为位置是标准的,要么因为不需要单个位置。
不同的发行版具有不同的软件包系统这一事实并不是因为具有不同的目录结构。这是发行版之间的主要区别之一。
答案2
如果我理解正确的话,你的意思是不同的程序的名称和路径在不同的发行版上应该是相同的,例如 Ubuntu、debian 和 redhat/centos。
我会以 Web 服务器 Apache 为例。一些发行版将其安装为 apache2 并将其配置文件命名为 apache2.conf ,而其他发行版将其安装为 httpd 并将其配置文件命名为 httpd.conf ,并且这些文件的路径在各个发行版之间也有所不同。
puppet 就是这样一个项目,它可以在不同的发行版之间实现配置管理的一致性(https://puppetlabs.com/) ,另一个是 Chef ,还有许多其他人。
这些配置管理系统向系统管理员隐藏了文件系统层次结构或路径名称或不同包名称的差异。
答案3
我的格式:
这文件系统层次结构标准(FHS) 是描述惯例用于 UNIX 系统的布局。”
由于它只是一组约定,并且 Linux 不是由单个公司创建的,因此各个 *nix 开发人员不可避免地会基于遗留代码和偏好等实际问题偏离标准。在混合中添加变量只会使事情变得更加复杂,而不是简化它们,因为发行版创建者仍然不会对任何人负责,而且当外壳以外的东西发挥作用时,“变量”就会成为一个非常模糊的概念。