输出列表用冒号(:)分隔每条路径。在我们使用的计算机上,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正在启动的命令是否是您要使用的命令。