如何在 Linux 上使用 which 命令

Linux which
命令标识当您向 shell 发出命令时启动的可执行二进制文件。如果您的计算机上有同一程序的不同版本,您可以使用 which
来找出 shell 将使用哪一个。
二进制文件和路径
当您尝试从终端窗口运行程序或命令时,shell(通常是现代发行版中的 Bash)必须找到该命令并启动它。一些命令,例如 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
-
/user/games
-
/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
并将我们正在调查的程序的名称作为命令行参数传递:
which htg

which
报告在 /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
。
观看那些结果
两个结果并不一定意味着两个二进制文件。
让我们看一个示例,其中我们将使用带有 -a
(全部)选项的 which
命令并查找 less
的版本程序:
which -a less

which
报告了两个存放 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
处理您提供给它的程序和命令列表,并列出每个程序和命令的结果。
哪个是哪个?
如果您愿意,您也可以通过键入以下内容对自身使用 which
:
which which
除了出于好奇而浏览 Linux 文件系统之外,which
在您期望命令或程序的一组行为但却得到另一组行为时最有用。
在这些情况下,您可以使用 which
来验证 Bash 正在启动的命令是您要使用的命令。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts