如何在Linux上使用Which命令

当您向shell发出命令时,Linux的哪个命令标识启动的可执行二进制文件。如果您的计算机上有同一程序的不同版本,您可以使用哪个版本来找出shell将使用哪个版本。

二进制文件和路径

当您尝试从终端窗口运行程序或命令时,shell(通常是现代发行版上的Bash)必须找到该命令并启动它。一些命令(如cd、History和pwd)内置于shell中,因此Bash不必太费力就能找到这些命令。

但是,Bash如何定位其他命令、程序和外部独立二进制文件呢?嗯,Bash使用路径,它实际上是路径的集合,每个路径指向一个目录。然后,它在这些目录中的每个目录中搜索与您试图运行的命令或程序相匹配的可执行文件。当它找到一个时,Bash启动它并放弃搜索。

您可以使用ECHO检查$PATH环境变量并查看PATH中的目录。为此,请键入以下内容,然后按Enter键:

echo $PATH

输出列表用冒号(:)分隔每条路径。在我们使用的计算机上,Bash将按以下顺序搜索以下目录:

/usr/local/sbin。 /usr/local/bin。 $/usr/sbin。 编号/usr/bin。 /sbin。 1个/2个。 用户/用户/游戏。 游戏/usr/local/Games。 自动/捕捉/仓位

文件系统中有许多名为/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(All)选项,则即使找到匹配项,该选项也会继续搜索:

which -a htg

然后,它列出路径中任何目录中的所有匹配项。

这就是问题所在-补丁中的目录中也有该程序的早期版本。在我们放置新版本程序的目录之前搜索该目录。

要进行验证,我们可以键入以下内容并显式运行该程序的每个版本:

/usr/local/bin/htg/usr/bin/htg

这就解释了问题,解决方案很简单。

实际上,我们还有其他选择。我们可以删除/use/local/bin目录中的旧版本,也可以将其从/usr/bin移动到/usr/local/bin。

看看那些结果

两个结果并不一定意味着两个二进制文件。

让我们看一个示例,在该示例中,我们将使用带有-a(All)选项的Which命令,并查找Less程序的版本:

which -a less

谁报告了两个地点,有一个版本的Less程序,但这是真的吗?在一台Linux计算机上安装两个不同的Less版本(或在多个位置安装相同的版本)会很奇怪。所以,我们不会接受它的输出。相反,让我们更深入地挖掘一下。

我们可以使用ls、-l(长列表)和-h(人类可读)选项来查看发生了什么:

ls -lh /usr/bin/less

文件大小报告为9个字节!这绝对不是Less的完整副本。

列表的第一个字符是“l”。普通文件的第一个字符应该是连字符(-)。“l”是一个符号,表示符号链接。如果您错过了这个细节,那么-->符号也表示这是一个符号链接,您可以将其视为一种快捷方式。这一条指向Lessin/bin的副本。

让我们使用less in/bin版本重试:

ls -lh /bin/less

这个条目显然是一个“真正的”二进制可执行文件。清单的第一个字符是连字符(-),这意味着它是一个常规文件,文件大小为167KB。因此,只安装了Less的一个副本,但是有一个从另一个目录指向它的符号链接,Bash在搜索路径时也会找到这个链接。

相关:如何使用ls命令列出Linux上的文件和目录

一次检查多个命令

您可以将多个程序和命令传递给,它将按顺序检查它们。

例如,如果您键入:

which ping cat uptime date head

它将遍历您为其提供的程序和命令列表,并列出每个程序和命令的结果。

哪个是哪个?

如果您愿意,您也可以通过键入以下内容来单独使用What:

which which

除了出于好奇浏览Linux文件系统之外,当您期望从命令或程序获得一组行为,但得到另一组行为时,这是最有用的。

在这些情况下,您可以使用哪个命令来验证Bash正在启动的命令是否是您要使用的命令。

相关文章