我注意到,当我安装新的应用程序时,有几个可能的目录将放置生成的二进制文件。
您可以使用打包管理器安装,使用make
, easy_install
for Python 等进行编译。
我的$PATH
样子如下:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
是否有一些约定或规则来确定应将生成的二进制文件(或库)放置在哪个目录中?
我注意到,当您编译源代码时,结果通常是/usr/local/bin/
.这是规则吗?
你能写出根据二进制文件解释 Unix 哲学(设计和约定决策)的答案吗?为什么会这样(为什么不为所有二进制文件只使用一个目录)
答案1
答案2
此外@Sardathrion答案是,sbin
目录通常用于存放各种系统管理工具、低级系统应用程序以及各种系统守护进程的二进制文件。
例如,在sbin
s 中你会发现诸如/sbin/init
(内核完成内部初始化后控制启动过程)、/sbin/hdparm
(读取和设置硬盘操作参数)、/usr/sbin/cupsd
(打印守护进程)、/usr/sbin/smartctl
(从硬盘读取 SMART 数据)、等等。
一般约定也是/usr
由包管理器管理,并由/usr/local
用户或系统管理员管理(在两者不相同的情况下)。这有历史先例:当磁盘空间昂贵时,/usr 可以通过网络以只读方式安装,并在许多工作站之间共享,即使系统不支持直接网络启动。然后,每个工作站都可以拥有自己的、相对较小的 /usr/local,以及可能的(相对轻量级的)根文件系统 ( /
)。 /usr 和 /usr/local 之间的这种区别很可能是大多数软件包在从源代码构建时默认安装到 /usr/local 的原因。
答案3
这文件系统层次结构标准指定Linux 发行版应将文件放置在何处。
bin
目录包含供任何用户使用的可执行文件,而sbin
目录包含仅供系统管理员使用的可执行文件。sbin
目录通常仅位于 root 的$PATH
.
/bin
(和/sbin
)包含启动过程早期所需的程序,因为/usr
可以安装在单独的分区上(尽管现在这种情况很少见)。
/usr/bin
(和/usr/sbin
) 包含发行版提供的程序,但不在/bin
或中/sbin
。在典型的系统上,绝大多数可执行文件都位于/usr/bin
.
层次/usr/local
结构是管理员的领域。目录/lib
、/bin
和通常保留给发行版,并且通常仅包含系统包管理器提供的文件/sbin
。(特别是和)不受程序包管理器的影响,因此本地管理员可以将手动安装的可执行文件放置在此处。/usr
/usr/local
/usr/local/bin
/usr/local/sbin
/usr/games
可能包含由发行版提供并被视为纯粹娱乐的可执行文件。这在很大程度上是历史遗留下来的(很久以前,/usr/games
一天中的某些时间可能是禁止的,但这种做法——无论如何很容易解决——已经消失了)。
Linux 系统上其他常见的可执行位置包括:
/usr/X11R6/bin
或/usr/bin/X11
用于 X 程序。将 X 程序与非 X 程序分开的做法已经逐渐消失。如今他们都住在/usr/bin
。/usr/bin/mh
对于可执行文件MH电子邮件客户端,它通过单一用途的 shell 命令操作电子邮件(show
显示消息、forw
转发邮件……)只有 MH 用户才会将/usr/bin/mh
其$PATH
./opt/bin
,如果存在,将包含指向安装在 中的应用程序的符号链接/opt
。
Linux 的规则受到大多数 UNIX 系统遵循的一般准则的启发,但每个 UNIX 变体都有自己的怪癖。例如:
- 在 *BSD 上,
/
仅/usr
包含发行版的核心:由发行版维护者直接维护的基本服务和应用程序。第三方程序(“程序包”或“端口”)安装在 中/usr/local
,即使它们由程序包管理器管理。系统管理员提供的程序没有普遍接受的单独位置。 - 一些 UNIX 系统没有目录,它是或 的
/bin
符号链接。/sbin
/usr/bin
- 某些系统可能有包含可选包的额外目录,每个目录都将其自己的
bin
目录放在$PATH
. - 某些系统可能有额外的目录,这些目录可能会也可能不会放置,具体取决于
$PATH
执行环境应兼容的内容,例如/usr/bin/posix
或/usr/xpg4/bin
为了/usr/xpg6/bin
与 POSIX/Single Unix 兼容,或者/usr/ucb
为了与遗留 BSD 系统兼容。