几天来我一直在寻找这个问题的各种变体,但一直没能找到一个明确的解释,因此我来这里寻求集体知识,希望能解决我在 Linux 发行版上的安装问题。
我已经安装了(或至少尝试安装了)来自 github 的几个包,并且我认为我可能已经正确安装了它们,因为当我使用which <package>
或时,<package> -h
我可以看到路径(都在 /usr/bin/ 中)和与正确程序相关的命令,但是,当我使用时apt-cache
找不到包。
我的问题是:在检查软件包安装时,apt-cache policy
使用which
、 和到底有什么区别?我安装每个软件包的方式略有不同,而且我都没有使用 Ubuntu 软件中心安装它们。-h
对于一个包:
git clone "package.git"
make
sudo ln -s ~/path/to/package_clone /usr/local/bin/.
为了另一个:
git clone https://github.com/package.git
cd pkg.dir/
sudo python setup.py install
pkg.dir -h
答案1
apt-cache
是软件包管理器apt
/的一个信息工具dpkg
。它只包含你通过它们安装的软件包的信息(请注意,软件中心只是它们的 GUI 前端),即常规 .deb 软件包(包括来自官方存储库和 PPA 的所有内容)。
如果您通过复制文件夹或运行安装脚本或make
命令来手动安装应用程序,则这些不是常规软件包,因此不受软件包管理器管理。这就是为什么apt-cache
找不到有关软件包的任何信息的原因 - 它们根本就不是软件包。
which
另一方面,该命令与包无关,它只是通过在$PATH
环境变量中指定的所有目录中搜索匹配名称的可执行文件来向您显示如果您键入特定命令将运行哪个可执行文件。
答案2
通过运行
apt-cache policy <package
。您将显示有关命名包的优先级选择的信息。必须事先安装相关软件包
apt-get
。它不会识别您手动安装的软件包(例如使用git
命令)。通过运行
which
命令,您可以询问系统如果您尝试执行该程序,那么该程序的确切路径是什么。每个用户都
PATH
定义了一个环境变量,其中包含操作系统将逐个搜索的目录列表,以查找与您输入的程序名称完全匹配的目录。您可以PATH
使用以下命令显示值:echo "$PATH"
您可能会得到类似于以下内容的结果:“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/snap/bin”。
如果你输入:
which mail
系统将检查:
/usr/local/sbin
包含吗mail
? —— 不包含。/usr/local/bin
包含吗mail
? —— 不包含。/usr/local/bin
包含吗mail
? —— 不包含。- 是否
/usr/bin
包含mail
?--是的。因此打印/usr/bin
。
这意味着如果你尝试运行:
mail
系统将运行该
/usr/bin/mail
程序。命令最常见的用途
which
是确保您在安装了多个版本的情况下运行程序的正确版本。或者验证程序是否可以运行。通过运行带参数的程序,
-h
您实际上是在尝试执行它。根据确切的实现,它可能会显示帮助,例如:mail -h
但是,请记住,这
-h
是一个惯常的参数,由程序本身来响应。并非所有程序都会显示此参数的帮助,有些程序可能会返回错误,有些程序可能会忽略并运行,有些程序可能会将其用于非常不同的目的。
没有“官方”的方法来验证手动安装的程序是否正确安装,但后两个命令(which
并尝试直接执行程序)将为您提供最佳的近似值。
--version
除了寻求帮助之外,您还可以尝试运行带有(或)参数的程序-v
,这是要求执行的程序显示其版本的常用方法。