如何“全局”安装tar文件?

Sir*_*had 5 command-line tar software-installation package-management

我想以一种可以立即在命令行上使用的方式安装本地 tar 文件,就像我使用了“sudo apt-get install XYZ”一样(假设没有依赖项)。

我知道如何解压 tar,然后使用 configure/make 进行编译,但这只会给我留下一个可执行文件,我必须稍后为其添加路径。

我想我可以复制到 /bin 并完成它,但我只是想知道这里的标准做法是什么。

作为奖励,很高兴知道如何使用 RPM 和其他类型的包来做到这一点。

Eli*_*gan 8

这个答案基于我发布的几条聊天消息,现在作为扩展摘要。

$PATH环境变量

通过“在命令行上立即可用”,我假设您的意思是您可以像 一样运行它name,而不必键入/path/to/name诸如/home/galahad/bin/name或 之类的东西./name

您的$PATH环境变量包含一个以 -:分隔的目录名称列表。当您在 shell 中运行包含/字符的命令时,它会被解释为要运行的可执行文件的确切位置和名称。但是,当您运行包含的命令时/,您的 shell 会在目录中搜索该$PATH名称的可执行文件,并运行它找到的第一个。(它可能还会记住您之前运行过的可执行文件所在的位置。因此,实际上,它不必每次都搜索它们。)

这就是./name运行name位于当前目录中的可执行文件的常用方法的原因。name相反,运行将搜索$PATH.

如果您运行,echo "$PATH"您将看到类似这样的内容,尽管它很可能不完全是这样:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Run Code Online (Sandbox Code Playgroud)

在目录中$PATH没有叫bin,但是这是常见的。

配置您的构建

当您拥有通过运行./configure和编译的源代码时make,您通常会使用make install(或sudo make install)来安装它。这将文件从构建目录复制到安装位置。当您正在安装的东西提供可执行命令,这些可执行文件通常被复制到一个目录中$PATH,或者你应该考虑加入$PATH

尽管构建和安装软件通常就像运行./configure, make,有时make checkmake test,然后make install或一样简单,但有时sudo make install您会希望将选项传递给configure脚本以配置构建。特别是,作为pfnuesel说,你这是怎么配置,其中该软件将被安装。即使该make install步骤实际安装软件,安装所有内容的位置通常也已在该./configure步骤中建立。

最常见的选项是--prefix. 默认前缀,当您不知道configure使用什么时,通常是/usr/local. (有时,程序或库的源代码默认为其他一些前缀。幸运的是,这种情况很少见。)

所以./configure通常等价于./configure --prefix=/usr/local. 要在您的主目录中安装软件,您可以使用./configure --prefix=/home/galahad(如果/home/galahad是您的主目录)或--prefix="$HOME". 当然,您仍然必须使用make. 我应该说,并非所有以源代码形式分发的软件都是以这种方式构建的。您应该始终在提取的源代码存档中查找文档。

什么--prefix意思

当您运行时,您表示该软件应安装在该目录下。但这很少(如果有的话)将松散文件放在. 相反,它将用于不同目的的文件放在. 如果这些子目录不存在,它会创建它们。./configure --prefix=directorydirectorydirectorydirectory

可执行文件通常会进入directory/bin,但directory/sbin如果它们通常用于系统管理,它们可能会进入,或者directory/games如果它们是游戏,它们可能会进入(现在很少见)。库进入directory/lib或另一个类似命名的目录,如directory/lib32. 头文件进去directory/include。手册页进去directory/man。软件使用的数据文件进入directory/share

这意味着什么directory是一个前缀。它是包含将安装不同文件的位置的父目录。因此,它在通过运行或创建的大多数文件和目录的绝对路径显示为前缀make installsudo make install

有一些例外。系统范围的配置文件——有时在安装将使用它们的软件时创建,但并非总是如此——通常进入/etc. 这通常不受指定不同前缀的影响。即使您在 中安装了很多软件/usr/local,它仍然主要使用/etc,并且您的/usr/local/etc目录可能不存在、为空或包含很少的文件。

在许多系统上,您可以通过运行man hier. 如果您使用的是 GNU/Linux 系统,您可能对Filesystem Hierarchy Standard感兴趣。

您的系统在哪里安装软件

作为系统一部分的大多数程序,包括由包管理器安装在绝大多数 GNU/Linux 操作系统(GoboLinux是一个例外)和其他一些类 Unix 系统中的程序,都以/usr. 您很少应该将该前缀传递给./configure,因为您通常希望避免与系统提供的软件发生冲突。

/usr允许位于网络共享或在引导过程早期尚未安装的分区上。此时必须可以访问的软件通常安装在/. 这就是为什么/usr/bin和 都/bin存在并且为什么sh通常是/bin/sh

包管理

大多数包管理器都支持安装二进制文件(尽管也有例外)。通常,当您使用包管理器在 GNU/Linux 系统中安装软件时,您正在安装二进制包。在这种情况下,包管理器本身不编译任何东西。但是,安装仍然涉及将文件复制或提取到文件系统中的位置。

当我说您的包管理器安装大多数带有/usr. 我并不是说它必须运行./configure --prefix=/usr或任何./configure命令。

不同的操作系统有不同的包管理器。如果您使用如Debian或Ubuntu分布,旨在为你使用像公用事业dpkgapt-get以及aptitude,那么你应该通常试图安装软件rpmyumdnf

但是包管理器的核心原则是相同的。当包管理器安装一个命令时,它通常会进入一个应该在用户$PATH环境变量中的目录。在 GNU/Linux 系统中,包管理器通常管理整个系统——除了你自己以其他方式安装的任何东西——因此安装大多数带有前缀的软件/usr,从而将大多数可执行命令放在/usr/bin. (当然,像运行make installor 一样sudo make install,包管理器通常也会将其他文件安装到其他位置。)


pfn*_*sel 5

如果您要安装的程序遵循良好做法,则可以使用以下命令安装它

./configure
make
make install
Run Code Online (Sandbox Code Playgroud)

./configure检查您的系统是否满足所有要求并配置安装选项。make编译所有内容,并将make install所有必要的文件复制到正确的位置。您不想手动完成最后一步,因为将所有库、手册页和诸如此类的东西放到正确的位置会非常乏味。

您还可以定义软件包的安装位置。例如,如果你想在你的主目录中安装一个包(因为你没有管理员权限),你可以使用

./configure --prefix="$HOME"/somefolder
Run Code Online (Sandbox Code Playgroud)

make install然后将其安装到此文件夹中。不过,通常你不需要这个。