如何在Linux上使用which命令
Linux的"which"命令标识了当我们向shell发出命令时启动的可执行二进制文件。如果计算机上具有相同版本的程序,则可以使用"which"来确定shell将使用哪个版本。
二进制和路径
当我们尝试从终端窗口运行程序或者命令时,shell程序(通常是Bashon现代发行版)必须找到该命令并启动它。一些命令(例如cd,history和pwd)内置在shell程序中,因此Bash不必费劲查找这些命令。
但是Bash如何找到其他命令,程序和外部独立二进制文件?好吧,Bash使用路径,它实际上是路径的集合,每个路径都指向一个目录。然后,它将在每个目录中搜索与我们要运行的命令或者程序相匹配的可执行文件。当找到一个时,Bash启动它并放弃搜索。
我们可以使用echo
来检查$ PATH
环境变量并查看路径中的目录。为此,键入以下内容,然后按Enter:
echo $PATH
输出列表用分号(:)分隔每个路径。在我们使用的计算机上,Bash将按以下顺序搜索以下目录:
/ usr / local / sbin
/ usr / local / bin
/ usr / sbin
/ usr / bin
/ sbin
/ bin
/用户/游戏
/ usr / local / games
/ snap / bin
文件系统中有许多名为/ sbin
和/ bin
的文件夹,这可能会引起一些混乱。
观察那些路径
假设我们有一个名为htg
的程序的更新版本。它在我们的当前目录中,我们可以通过键入以下命令来运行它:
。/ htg
它不是一个程序,它只是打印版本号,然后关闭。新版本是1.2.138.
要在当前工作目录中运行程序,必须在程序名称前键入./,这样Bash知道其中可以找到它。
因为我们想从任何目录运行这个特定程序,所以我们将把可执行文件移到" / usr / bin"目录中。 Bash将在路径中找到该程序并为我们运行它。
我们不需要当前目录中的可执行文件,也不需要在程序名称前键入./,如下所示:
sudo mv htg /usr/bin
现在,让我们尝试通过键入以下内容来运行程序:
htg
某些东西在运行,但这不是我们新的,更新的程序。而是较旧的版本1.2.105.
哪个命令
我们上面演示的问题是为什么设计了which命令的原因。
在此示例中,我们将使用which
并将要研究的程序的名称作为命令行参数传递:
which htg
哪个报告在/ usr / local / bin目录中找到了htg版本。由于该位置出现在我们将已更新的" htg"移动到的目录之前的路径中,因此Bash使用了该程序的早期版本。
但是,如果我们使用如下所示的-a(所有)选项,则即使找到匹配项,which也会继续搜索:
which -a htg
然后,它列出路径中任何目录中的所有匹配项。
因此,这就是问题所在,该目录中也存在该程序的较早版本,该目录也位于补丁程序中。并且在我们删除程序新版本的目录之前正在搜索该目录。
为了验证,我们可以键入以下内容并显式运行该程序的每个版本:
/usr/local/bin/htg
/usr/bin/htg
这说明了问题,解决方案很简单。
实际上,我们有选择。我们可以在" / use / local / bin"目录中删除旧版本,也可以将其从" / usr / bin"移至" / usr / local / bin"。
观看那些结果
两个结果不一定表示两个二进制文件。
让我们看一个示例,在该示例中,我们将which
命令与-a
(all)方法一起使用,并查找less
程序的版本:
which -a less
"哪个"报告了两个存放" less"程序版本的位置,但这是真的吗?在Linux计算机上安装两个不同版本(或者在多个位置使用相同版本)的less
是很奇怪的。因此,我们不会接受来自"which"的输出。取而代之的是让我们更深入地研究。
我们可以使用ls
,-l
(长列表)和-h
(人类可读)选项来查看发生了什么:
ls -lh /usr/bin/less
文件大小报告为九个字节!那绝对不是less
的完整副本。
列表的第一个字符是l。普通文件的第一个字符为连字符(-)。 l是表示符号链接的符号。如果我们错过了该细节,->
符号也表示这是一个符号链接,我们可以将其视为一种快捷方式。这指向/ bin
中的less
的副本。
让我们再试一次/ bin中的less
版本:
ls -lh /bin/less
该条目显然是真正的二进制可执行文件。列表的第一个字符是连字符(-),表示它是常规文件,文件大小为167 KB。因此,仅安装了一个less
副本,但是从另一个目录有指向它的符号链接,Bash在搜索路径时也会找到它。
一次检查多个命令
我们可以将多个程序和命令传递给which
,它将按顺序检查它们。
例如,如果我们键入:
which ping cat uptime date head
which
将在我们提供的程序和命令列表中进行工作,并列出每个程序的结果。