Linux 中的 which
命令确定可执行二进制文件,当您向 shell 发出命令时将执行该二进制文件。如果您的计算机上有相同程序的不同版本,您可以使用 which
找出将使用哪个 shell。
Linux 中使用 which 命令的说明
- 二进制和路径
- 查看链接
- 哪个命令
- 查看结果
- 同时检查多个命令
二进制和路径
当您尝试从终端窗口运行程序或命令时,shell(通常是现代发行版上的 Bash)必须找到该命令并启动它。许多命令,例如 cd
、 history
和 pwd
都集成在 shell 中,因此 Bash 无需花费太多精力即可找到它们.
但是 Bash 是如何定位外部命令、程序和其他独立二进制文件的呢? Bash 使用路径,即一组路径,每个路径都指向一个目录。然后它会搜索每个目录以找到与您尝试运行的命令或程序相匹配的可执行文件。当您找到合适的文件时,Bash 将启动它并放弃搜索。
您可以使用echo
检查$ PATH环境variable并查看目录路径。为此,请输入以下内容,然后按 Enter
:
echo $PATH
输出列表用冒号(:
分隔每个路径。在本文使用的计算机上,Bash 将按以下顺序搜索目录:
- /usr/local/sbin
- /usr/local/bin
- /usr/sbin
- /usr/bin
- /sbin
- /斌
- /Users/游戏
- /usr/本地/游戏
- /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
并将我们正在测试的程序的名称作为命令行参数传递:
which htg
which
命令报告它在 /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
which
语句报告了两个包含 less
程序版本的位置,但这是真的吗?奇怪的是,Linux 计算机上安装了 less
程序的两个不同版本(或多个位置的相同版本)。因此,我们不会接受 which
的输出。相反,请深入挖掘。
您可以使用 ls
、 -l
(长列表)和 -h
(人类可读的)选项,看看接下来会发生什么:
ls-lh/usr/bin/less
报告的文件大小为9字节!这绝对不是 less
的完整副本。
列表的第一个字符是 l 。普通文件将连字符 (-) 作为第一个字符。 'l' 是符号链接的符号。如果你错过了那个细节,-> 图标也表明这是一个符号链接(你可以将其视为一种快捷方式)。这表示 /bin 中有 less
的副本。
请在/bin:
中使用less
版本重试
ls-lh/bin/less
这个条目显然是一个真正的二进制可执行文件。列表的第一个字符是一个连字符(-),这意味着它是一个常规文件,文件大小为 167KB。因此,只安装了一个 less
副本,但是有一个从另一个目录到它的符号链接,Bash 在搜索路径时也会找到它。
同时检查多个命令
您可以将多个程序和命令传递给which
,它会按顺序检查它们。
例如,如果你输入:
哪个ping cat uptime date head
which
命令会根据你提供的程序和命令列表工作,然后列出每个程序的结果。
除了出于好奇深入研究 Linux 文件系统之外,which
在您期望命令或程序的一组行为时最有用,但是买点别的。
您可以使用其中的 which
来验证正在启动的 Bash 命令是否是您要使用的命令。
评论