我的目的是:我正在第n次安装Oracle JDK,并决定这一次将其放在"/home/user"目录下。我只是随便看看,想知道在单用户机器上这样做是否是个坏主意。
/usr
,尽管那时它已经与"用户"没有任何关系了。所以是的,像"UNIX Source Repository"或"UNIX System Resources"这样的花哨名字都是虚构的名字,而且现在改名已经太迟了。但是,正如我们所见,把/bin
、/lib
和/sbin
扔进去还不算晚。所以/usr
现在是主要的"系统"目录。
"好的,那/usr/sbin
呢?",你问道。该死,我希望你忘了。好吧... /usr/sbin
用于只能(或者仅在)由root
用户执行的命令,比如mount
和fdisk
。
"但这不是和/bin
几乎一样吗?" 是的,没错,但是...
"等等,那为什么还有一个/sbin
呢?这一点都没有意义!" 嗯,那是因为... 呃... 等一下...
看,你身后有只三头猴子!
好了,希望你已经分心了。继续说下去...
如果你认为我在作弊,是的,我确实在作弊。但是"官方"答案也是如此: "必须由root执行并且在挂载/
之前就要可用的关键命令。" 什么?别闹了!事实上:界限确实模糊不清,还有很多遗留的名称和路径只是"卡住"了,现在很难摆脱。
更多关于合并/usr
目录的理由,来自systemd
文档:
目前,关于安装目录,你最好的理解方式是这样思考:
/usr
- 所有由操作系统安装或提供的系统范围内的只读文件。
/usr/local
- 由本地管理员(通常是您)安装的系统范围内的只读文件。这就是为什么大多数来自/usr
的目录名称在这里重复的原因。
/opt
- 一个用于系统范围内的只读和自包含软件的灾难。也就是说,这些软件不会像规范良好的软件那样将文件分散在bin
、lib
、share
、include
等目录中。
~/.local
- /usr/local
的每个用户对应目录,即每个用户安装的软件。与/usr
类似,它有自己的~/.local/share
、~/.local/bin
、~/.local/lib
目录。
~/.local/opt
- /opt
的每个用户对应目录。
那么软件应该安装在哪里呢?
上面的列表已经给出了你关于Oracle JDK问题的一半答案,至少它提供了几个线索。关于“我应该在哪里安装软件X?”的检查清单如下:
如果它是一个完全自包含的、单个目录的软件,像Eclipse IDE和其他下载的Java应用程序一样,并且您希望它对所有用户都可用?那么请安装在/opt
目录下。
与上述情况相同,但您不关心其他用户,只想为您自己安装?那么请安装在~/.local/opt
目录下。
如果它的文件分散在多个目录中,例如bin
和share
,就像使用./configure && make && sudo make install
编译和安装的传统软件一样,并且应该对所有用户都可用?那么请安装在/usr/local
目录下。
与上述情况相同,但只针对您自己的用户安装?那么请安装在~/.local
目录下。
由操作系统或软件包管理器(如软件中心)安装的软件,最重要的是,任何本地修改可能会在更新管理器升级到新版本时被覆盖?那么请安装在/usr
目录下。
注:
这就解释了为什么编译软件的默认安装前缀是/usr/local
,以及为什么在只为自己的用户安装软件时应将其更改为./configure --prefix=$HOME/.local
。/etc
(用于系统范围的软件)和~/.config
(用于每个用户的设置)中。尽管许多传统软件(不幸的是,一些现代软件也是如此)仍然使用~/.<software-name>
,在您的主文件夹根目录中堆积了数十个隐藏的目录和文件。
~/.local
和~/.config
不是FHS规范的一部分。FHS不涉及用户的主文件夹。它们是Freedesktop/XDG的一次尝试,该组织面向桌面环境(如Gnome、KDE和Unity),试图制定一些关于用户主文件夹结构的约定。并非所有软件都遵循它(例如,发行版最近才将~/.local/bin
包含在用户的默认$PATH
中,仅当它存在时),并且没有用户被强制遵循它,但如果他们这样做,两者都会获得许多互操作性的好处。$PATH
是无关紧要的。攻击者甚至可以通过~/.profile
来改变它,所以你的观点是无意义的。~/.local/bin
和~/bin
一样安全(或者说不安全,如果你愿意),这在大多数发行版中都是常见做法。认为用户不应该在$PATH
中保留和执行个人脚本的任何目录是荒谬的。 - MestreLion~/bin
和 ~/.profile
一样安全,而 $PATH
不能保护我免受由我自己运行的恶意软件的侵害(该恶意软件具有在我的个人目录中写入的权限)。我之前不知道这个文件,对此我感到抱歉。谢谢你的解释,对我之前的评论表示道歉。 - ignis/opt
也更常见,并且还有自包含的_snaps_,但是现如今部分仍然保持不变。 - MestreLion
/usr
是一个隐藏的“用户”目录,但如今你终于意识到这是个令人沮丧的错误。 - Govind Rai