Linux which命令标识在向shell发出命令时启动的可执行二进制文件。如果您的计算机上有同一程序的不同版本,您可以使用哪个来确定shell将使用哪个版本。
当您试图从终端窗口运行程序或命令时,shell(通常是现代发行版上的Bash)必须找到该命令并启动它。有些命令(如cd、history和pwd)是内置在shell中的,因此Bash不必费劲地查找这些命令。
但是Bash如何定位其他命令、程序和外部独立二进制文件呢?Bash使用路径,实际上是一组路径,每个路径指向一个目录。然后,它在每个目录中搜索与您试图运行的命令或程序匹配的可执行文件。当它找到一个时,Bash启动它并放弃搜索。
可以使用echo检查$PATH环境变量并查看路径中的目录。为此,请键入以下内容,然后按Enter键:
echo $PATH输出列表用冒号(:)分隔每条路径。在我们使用的计算机上,Bash将按以下顺序搜索以下目录:
文件系统中有许多名为/**in和/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。
两个结果并不一定意味着两个二进制文件。
让我们看一个示例,在该示例中,我们将使用which命令和-a(all)选项,并查找less程序的版本:
which -a less哪两个地方有less程序的版本,但这是真的吗?在一台Linux计算机上安装两个不同版本(或者在多个位置安装同一版本)的less是很奇怪的。所以,我们不接受它的输出。相反,让我们更深入一点。
我们可以使用ls、-l(长列表)和-h(人类可读)选项来查看发生了什么:
ls -lh /usr/bin/less文件大小报告为9个字节!这绝对不是less的完整副本。
列表的第一个字符是“l”。普通文件的第一个字符是连字符(-)。“l”是一个符号,表示符号连接。如果忽略了该细节,则-->;符号还表示这是一个符号链接,可以将其视为一种快捷方式。这个指向less in/bin的副本。
让我们用less in/bin的版本再试一次:
ls -lh /bin/less这个条目显然是一个“真正的”二进制可执行文件。清单的第一个字符是连字符(-),这意味着它是一个常规文件,文件大小为167KB。因此,只安装了less的一个副本,但是有一个从另一个目录指向它的符号链接,Bash在搜索路径时也会找到这个链接。
相关:如何使用ls命令列出Linux上的文件和目录
你可以传递多个程序和命令给它,它会按顺序检查它们。
例如,如果键入:
which ping cat uptime date head它通过提供给它的程序和命令列表工作,并列出每个程序和命令的结果。
如果您有这种倾向,您也可以通过键入以下内容来使用它本身:
which which除了出于好奇而浏览Linux文件系统之外,当您期望从一个命令或程序获得一组行为时,这是最有用的。
在这些情况下,您可以使用哪个来验证Bash正在启动的命令是您想要使用的命令。
要在Linux中重命名文件吗?如果您知道如何在Windows、macOS或Chrome操作系统中完成这项工作,那么您就知道如何在这里完成这项工作。在大多数版本的Linux上,您只需右键单击一个文件并选择Rename选项。 ...
想在Linux系统上添加用户但不知道如何添加?在Linux上使用命令行界面管理用户无疑是一项复杂的工作。而对于初学者来说,即使添加新用户也是一场噩梦。 ...
虽然您可能已经知道如何使用GUI文件浏览器在Linux中移动文件,但您可能想知道终端中是否有move命令允许您将文件快速移动到不同的目录。mv命令就是您想要的命令,它的简单语法和一些可选的安全标志很容易使用。 ...
...您可能还想将自己喜欢的程序添加到启动过程中。下面是如何控制Ubuntu在登录时启动什么。 我们在Ubuntu20.04 LTS上用默认的GNOME桌面运行了这个过程。这些步骤在其他带有GNOME桌面的Linux发行版上是类似的,但是您可能需要在其他...
Bash不是唯一的Linux shell。很容易尝试其他的shell,比如非常流行的Zsh。找到一个您喜欢的shell后,使用chsh命令将其设置为默认shell。我们会教你怎么做。 为什么贝壳很重要 shell位于您和操作系统之间。它在终端窗口内提供环境...
...但这并没有什么不好的地方。我们将解释它的作用,以及如何调整它。 什么是$path,它是如何工作的($path on linux, and how does it work)? 当您在终端窗口中键入一个命令并按Enter键时,您甚至在执行命令之前就开始了大量的活动。 B...
...管是什么原因,如果你被迫或只是喜欢使用手指,这里是如何安装和使用它。 相关:如何在Linux上使用pinky命令 安装手指 您可以使用以下命令在Ubuntu上安装finger: sudo apt-get install finger 要在Fedora上安装finger,请使用以下命令:...
...改Linux文件权限,乍看起来很复杂,但一旦你知道它们是如何工作的,实际上就相当简单了。 chmod修改文件权限 在Linux中,谁可以对文件或目录做什么是通过权限集来控制的。有三组权限。一组用于文件所有者,另一组用于文...
想知道一个进程运行了多长时间以及更多吗?Linux time命令返回时间统计信息,让您对程序所使用的资源有更深入的了解。 时间有很多亲戚 有许多Linux发行版和不同的类Unix操作系统。每一个都有一个默认的命令shell。现代Linux发...
...些指南汇总到一个大列表中。 windows上linux入门 相关:如何在windows10上安装和使用Linux Bash Shell 您可以在任何版本的windows10(包括windows10home)上安装Linux环境和bashshell。但是,它确实需要64位版本的Windows10。您只需启用Windows Subs...