在Windows中,系统驱动器C:
有一个目录program_files
,在该目录下每个程序都有自己的目录。
在Linux中,在/usr/
和下/usr/local/
,有/bin, /etc, /share, /src
等。
因此,在Windows中,每个程序的所有文件都分组在同一目录中,而在Linux中,所有程序的相同类型的文件都分组在同一目录中。
我觉得Windows组织安装程序的方式比Linux的方式更符合逻辑,因此安装的程序更容易手动管理。
Linux 组织已安装程序文件的方式有什么好处?谢谢。
当我遇到以下问题时我有这个问题如何组织 $HOME 中已安装的程序以便 shell 在运行时搜索它们?,我尝试以$HOME
Windows 的方式组织我的程序,但在指定程序的搜索路径时遇到一些问题。
答案1
在 Linux 中,如果维护得当,不同的位置通常会反映一些逻辑。例如。:
/bin
包含最基本的工具(程序)/sbin
包含最基本的管理程序
它们都包含启动和基本故障排除所使用的基本命令。在这里你看到了第一个区别。有些程序不适合普通用户使用。
然后进去看看/usr/bin
。在这里您应该找到更多的命令(程序)选择,通常超过 1000 个。它们是标准工具,但不如/bin
和中的工具那么重要/sbin
。
/usr/bin
包含命令,而配置文件位于其他地方。这既分离了功能实体(程序)及其配置和其他文件,但就用户功能而言,这很方便,因为命令不与其他任何内容混合,可以简单地使用PATH
指向可执行文件的变量。它还引入了清晰度。无论是什么都应该是可执行的。
看看我的PATH
,
$ echo "$PATH" | perl -F: -anlE'$,="\n"; say @F'
/home/tomas/bin
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games
正好有六个位置包含我可以直接调用的命令(即不是通过它们的路径,而是通过它们的可执行文件的名称)。
/home/tomas/bin
是我的主文件夹中用于存放私人可执行文件的私人目录。/usr/local/bin
下面我将分别说明。/usr/bin
如上所述。/bin
上面也有描述。/usr/local/games
/usr/local
是(下面解释)和游戏的组合/usr/games
是游戏。不要与实用程序可执行文件混合,它们有各自的位置。
现在到/usr/local/bin
.这个有点滑,已经在这里解释过:/usr/local/bin 是什么?。要理解它,您需要知道该文件夹/usr
可能被许多计算机共享并从网络位置安装。如前所述,与 中的命令不同,启动时不需要这些命令/bin
,因此可以在启动过程的后期阶段安装该位置。它也可以以只读方式安装。/usr/local/bin
另一方面,是针对本地安装的程序,并且需要可写。因此,虽然许多网络计算机可能共享通用/usr
目录,但每台计算机都将/usr/local
在公共/usr
.
最后,看一下PATH
我的root用户的:
# echo "$PATH" | perl -F: -anlE'$,="\n"; say @F'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
它包含这些内容:
/usr/local/sbin
,其中包含类型的管理命令/usr/local
/usr/local/bin
,这与普通用户可以使用的相同。同样,它们的类型可以描述为/usr/local
。/usr/sbin
是非必要的管理实用程序。/usr/bin
是非必要的管理和常规用户实用程序。/sbin
是必不可少的管理工具。/bin
是管理员和普通用户必备的工具。
答案2
现在我认为这是对经典UNIX的历史继承。
在第一个 UNIX 版本中,程序并不像现在那么大。这些程序通常由一个使用系统库的可执行文件组成。因此,没有人考虑过由几个自己的库组成的程序。主库是 C 库,每个程序都知道它的位置。
此外,UNIX 环境被视为成品(用于准备文档)。因此所有工具的路径都是固定的。
如今,HDD(硬盘驱动器)时代的固定路径带来了一些好处。如果FSH(文件系统层次结构)分割在单独的磁盘分区上,并将带有二进制文件和库的分区放在HDD的主要扇区附近,那么程序启动的时间会快一点。
答案3
/usr/bin
您似乎正在讨论按用途(用于可执行文件、/usr/lib
用于库)而不是按应用程序包(一个目录中的 C++ 编译器,另一个目录中的图像编辑程序)划分各个文件的风格。虽然在 Unix 系统中,造成这种情况的主要原因是历史原因,但当今也有一些力量倾向于使类 Unix 系统倾向于这一点:管理系统上大部分程序的包管理器。
在 Windows 上,从历史上看,现在仍然如此,应用程序一直负责提供自己的安装程序,尤其是卸载程序,甚至现在也经常不向任何中央应用程序列表注册自己。在这种情况下,应用程序通常最好有一个“自己的”目录来存放尽可能多的文件。这有助于避免与其他应用程序发生冲突,尽管这并不总是有效(特别是在DLL)。
另一方面,Unix 系统自 90 年代以来一般都有一个公认的包管理器和一个通过该包管理器提供大量常用软件的组。 (各种 Unices 的官方包管理器包括yum
Linuxapt
系统、pkgsrc
NetBSD 和ports
FreeBSD。商业 Unix 系统通常也会有一个非官方但广泛接受的包管理器,例如brew
MacOS。)
这些包管理器的优点是它们可以并且确实跟踪系统上它们“拥有”的各个子目录中的每个文件。因为单个组在这里分配每个文件的名称和位置,所以他们都可以使用在他们之间共享的一小组目录。这提供了各种优势,特别是在应用程序之间共享文件以及减少搜索库和可执行文件所需的路径数量方面。
也就是说,Unix 中也有“每个应用程序单独的目录”安装的悠久传统,通常安装在该/opt
目录下。
答案4
您所看到的现代类 Unix 系统并不是真正的传统系统。
/
通常,只有系统实用程序的层次结构相当少/usr
,然后程序被单独安装到 的子目录中/usr/local
,然后通过创建符号链接使其可用。
GNU 软件的一个非常典型的设置是编译和安装
./configure
make
make install prefix=/usr/local/DIR/program-1
cd /usr/local/DIR
stow program-1
GNU存放实用程序创建符号链接以使软件在标准路径上可用,而无需向 PATH 变量添加任何目录(就像 Windows 所做的那样,并且 cruft 往往会在那里积累)。
然而,现代 Linux 发行版将所有内容都作为现成的软件包提供,因此程序已成为“系统”的一部分。因为包管理器负责安装,所以不需要符号链接,并且分离程序没有任何用处(但会减慢程序启动速度,因为必须扫描许多小目录)。
如果您想将软件安装到您的主目录中,我建议您也使用 GNU stow — 这将允许您将程序分开,如果您不使用包管理器,这是明智的。
我的传统设置是在一个目录~/software/DIR
中安装程序,然后使用 stow 来DIR
创建等等~/software/bin
。~/software/share
这意味着我只需添加~/software/bin
到 PATH 变量即可获取所有已安装的软件。
使用:
./configure --prefix=~/software
make
make install prefix=~/software/DIR/program-1
cd ~/software/DIR
stow program-1
如果程序遵循 GNU 约定,则进行安装。