在安装用户应用程序时,“最佳实践”建议将它们放置在哪里?

有时候我会手动安装应用程序,而不是使用apt或其他软件包管理器。
根据“最佳实践”,在安装用户应用程序时建议使用哪个位置(/usr/、/usr/local/、/opt/、/home/等)?

我喜欢时不时地从源代码安装东西,所以我写了一个 小工具 来完成这个任务,它会自动对你的Shell启动文件进行修改(如果需要,还可以修改依赖共享库的程序的库前缀)。功能不算多,但99%的情况下都能正常运作。 - new123456
相关帖子:http://askubuntu.com/q/138547/62483 - Lucio
6关于/opt/usr/local之间的区别,这是一次很棒的讨论:http://unix.stackexchange.com/q/11544/11917 - blong
还可以查看文件系统层次结构标准中的“目的”子部分。 - djvg
6个回答

那要看情况。如果应用程序有一个makefile,或者例如对于Python应用程序,如果应用程序使用distutils(例如,有一个setup.py文件),或者类似的构建/安装系统,你应该将其安装到/usr/local/中。这通常是默认行为。
据我了解,/usr/local/的层次结构与/usr/类似。然而,像/usr/bin//usr/lib/这样的目录通常保留给通过apt安装的软件包。因此,期望被"安装"到/usr/的程序在/usr/local/中应该可以正常工作。
如果你只需要提取一个tarball并直接运行(例如Firefox),那么将它放入/opt/中。一个只需要一个目录,并且所有文件/库都相对于该目录的程序可以在/opt/中获得一个目录。
请参考FHS

4在/usr/bin中创建一个符号链接,或者将其添加到~/.bashrc的PATH中。 - Alex
2~/.local/share 是什么情况?@Marco - Lakindu Akash
2你可以在~(你的主目录)中安装东西,但这将使应用程序只能被一个用户访问。系统上的其他用户将需要安装和维护他们自己的软件安装。至于在主目录中安装应用程序的最佳实践,我认为没有太严格的指导方针,因为这样做不会干扰系统软件包。 - Umang
1在/home/ubuntu/myapp下安装从tar解压的应用程序是否有问题?与/opt/myapp相比,这会有什么区别吗? - JARC
2@JARC,这只能对系统上的一个用户(在您的情况下是“ubuntu”用户)可用。 - Umang
1对于仅特定用户使用的程序,systemdXDG建议使用~/.local/bin。更多信息请参考这里的答案herehere - Matthias Braun

记住,/usr并不代表用户,而是代表Unix系统资源
因此,我倾向于认为任何发行版都有权利覆盖/usr的内容,而我对系统的特定添加放在/usr/local中,在升级之前保留它们。
与此同时,应用程序和其他东西放在/opt中。
有些人喜欢把东西放在/home中,但我很少遵循这个惯例。
话虽如此,当手动安装东西时,我会先让发行版的软件包管理器按照它的方式进行操作,然后再执行上述步骤。

47值得记住的是,在添加“/home”之后,才对“Unix系统资源”进行了重命名。在很久很久以前(Unix版本6等),你会看到像/usr/jimmy、/usr/siobhan、/usr/ahmed等目录,因为“用户”目录存储在/usr中。 - Mark Leighton Fisher
10好吧,我来解答:opt是什么的缩写? - Seth
5@Seth 我认为这是“可选的” - 它最初是用于不包含在默认安装中的软件。 - Carl H
10/usr 是 User 的缩写。这是因为 Linux 用户都是开发人员。最初,当 Linux 开始分为开发人员和用户时,引入了 /home 目录。然后有人提出了一个想法,说它代表着 Unix 系统资源,但实际上并没有太多意义,因为我们已经在 /dev 中有了 Unix 系统资源 - Info-Screen
5正确,/usr是一个反向首字母缩略词。自Unix在1969年运行在PDP-7上以来,其目的已经发生了变化。 - Walt Stoneburner
2哇,这个历史背景真的让事情变得清晰明了。非常感谢Walt Stoneburner和Mark Leighton Fisher。 - Cameron Hudson

/home/user/opt/中安装不稳定的程序(如firefox devel)会更容易删除,而且不会让其他用户混淆应该使用哪个版本...所以,如果这不是一个全局使用的程序,请将其安装在您的主目录下的子文件夹中(/home/user/)。
永远不要在/usr/中安装程序,这很可能引起混乱。在/usr/中安装的东西只适用于分发软件包。/usr/local/是用于本地编译的软件包。它们的结构完全相同!/usr/local/中的文件将优先于/usr/中的文件。 /opt/应该用于安装预编译的(二进制)软件包(如Thunderbird,Eclipse,Netbeans,IBM NetSphere等)。但如果它们只供单个用户使用,则应将其放在您的主目录下。
如果你想要能够在一个“奇怪”的位置运行安装的程序(比如/home/user/opt/firefox/),而不需要输入整个路径,你需要将其添加到你的$PATH变量中。你可以通过在/home/user/.profile文件中添加以下一行来实现这个目的。
export PATH=/home/user/opt/firefox:$PATH

文件夹的名称应该是您需要运行的可执行文件所在的那个文件夹。

Linux文件系统层次结构标准指出了/usr/local
来自http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/usr.html
“'/usr/local'的最初想法是在每台机器上都有一个单独的('local')'/usr'目录,除了'/usr'之外,它可能只是从其他地方以只读方式挂载。它复制了'/usr'的结构。如今,'/usr/local'被广泛认为是存放自编译或第三方程序的好地方。/usr/local层次结构用于系统管理员在本地安装软件时使用。当系统软件更新时,它需要安全,不会被覆盖。它可以用于在一组主机之间共享的程序和数据,但在/usr中找不到。除非正在安装以替换或升级/usr中的软件,否则必须将本地安装的软件放置在/usr/local而不是/usr中。”

4似乎与opt页面上的信息/usr/local有矛盾:http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/opt.html "此目录保留给所有不属于默认安装的软件和附加包。例如,StarOffice、Kylix、Netscape Communicator和WordPerfect包通常存放在这里。为了符合FSSTND的规定,所有第三方应用程序都应该安装在此目录中。" ... "(类似于Windows将新软件安装到其自己的目录树C:\Windows\Progam Files"Program Name")" - Pod

我家里通常有一个名为“程序”的文件夹,我在那里安装这些程序,奇怪的是(或者也许不奇怪),现在它们都是Java相关的东西。
对我来说,这有一个很大的优点,当我重新安装系统或更换电脑时,它们会随着我的个人文件一起被移动。但同时也存在一个明显的缺点,那些应用程序只能供我的用户使用。

如何在不丢失主文件夹中的数据的情况下重新安装Ubuntu 16.04?我尝试只格式化/目录,然后输入相同的旧用户名和密码,但发现Ubuntu创建了另一个主文件夹。 - Ibrahim Disouki

使用"checkinstall"将您的外部软件包转换为deb包,以便可以使用软件包管理器进行卸载。
请注意,配置文件通常不会被视为配置文件(可能被忽略,或者被视为应用程序的一部分),而且预安装和后安装脚本有时可能会出错,尽管它通常会在认为deb包的预安装或后安装脚本有问题时发出警告。