Sir*_*had 5 command-line tar software-installation package-management
我想以一种可以立即在命令行上使用的方式安装本地 tar 文件,就像我使用了“sudo apt-get install XYZ”一样(假设没有依赖项)。
我知道如何解压 tar,然后使用 configure/make 进行编译,但这只会给我留下一个可执行文件,我必须稍后为其添加路径。
我想我可以复制到 /bin 并完成它,但我只是想知道这里的标准做法是什么。
作为奖励,很高兴知道如何使用 RPM 和其他类型的包来做到这一点。
这个答案基于我发布的几条聊天消息,现在作为扩展摘要。
$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 check
或make 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=directory
directory
directory
directory
可执行文件通常会进入directory/bin
,但directory/sbin
如果它们通常用于系统管理,它们可能会进入,或者directory/games
如果它们是游戏,它们可能会进入(现在很少见)。库进入directory/lib
或另一个类似命名的目录,如directory/lib32
. 头文件进去directory/include
。手册页进去directory/man
。软件使用的数据文件进入directory/share
。
这意味着什么directory
是一个前缀。它是包含将安装不同文件的位置的父目录。因此,它在通过运行或创建的大多数文件和目录的绝对路径中显示为前缀。make install
sudo 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分布,旨在为你使用像公用事业dpkg
,apt-get
以及aptitude
,那么你应该不通常试图安装软件rpm
,yum
和dnf
。
但是包管理器的核心原则是相同的。当包管理器安装一个命令时,它通常会进入一个应该在用户$PATH
环境变量中的目录。在 GNU/Linux 系统中,包管理器通常管理整个系统——除了你自己以其他方式安装的任何东西——因此安装大多数带有前缀的软件/usr
,从而将大多数可执行命令放在/usr/bin
. (当然,像运行make install
or 一样sudo make install
,包管理器通常也会将其他文件安装到其他位置。)
如果您要安装的程序遵循良好做法,则可以使用以下命令安装它
./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
然后将其安装到此文件夹中。不过,通常你不需要这个。