如何在Linux中确定命令运行的位置

4
假设我在Unix中运行像lsrm这样的命令,并且路径变量设置如下:
PATH=$JAVA_HOME/bin:.:$ORACLE_HOME/bin:/sbin:/usr/sbin:/usr/bin:/usr/ccs/bin:$COBDIR/bin:/sbin:/bin:/usr/local/bin:/bin

如何知道ls命令从哪个路径运行?ls(只是一个例子)可能存在于/sbin/usr/bin中。

所以我想知道它是从哪里运行的?

我无法承担搜索所有目录并知道ls位于哪些目录中的成本。有没有直接的方法来搜索ls从哪里运行?

3个回答

6

当你在bash中运行外部命令时,bash会对该命令进行哈希处理,以避免重复查找路径。hash命令可以告诉你已运行的命令。如果该命令在哈希的生命周期内没有运行,则会出现错误。

$ hash -t ls
-bash: hash: ls: not found

$ ls foo
$ hash -t ls
/bin/ls

了解 hashwhichtype命令的区别很有优势。
  • hash 告诉你使用或已经被哈希过的路径/命令。如果在 hash 生命周期内更改了 PATH 或文件系统,hash 可以告诉你更改之前发生过的命令。
  • which 是一个外部命令,用于查找 PATH 环境变量中的命令。
  • type 是一个内置命令,用于在本地 PATH 变量中查找命令,这与环境中的不同(但几乎从不使用)。
在您的 Bash 中键入 help hash 以了解更多信息。

在大多数情况下,“type”可能是最好的选择,因为它可以正确地识别shell内置命令、函数和其他类似的内容。 - Kevin
这个方法可行,而且概念也变得清晰了。问题在于我的当前目录下有一个文件名为“ls”的文件。因此实际的ls命令无法正常工作。通过哈希命令,我能够知道它是从当前目录中获取的,而不是/bin目录。 - Gaurav Khurana

4

只需使用 which 来定位它将从哪里被拾取。

$ which ls
  /bin/ls

它将列出它选择的可执行文件路径。因此,从上面的命令中,我的ls命令位于/bin目录中。

0

除了其他提到的whichtypehash外,您还可以使用whereis(1)命令(如果已安装在您的系统上)。

whereis告诉您命令应该去的标准位置。

如果您的交互式shell是zsh,您还可以使用=ls单词,例如echo =lsls =ls来查找shell所引用的ls

您还可以别名ls,或者有一个伪装/bin/ls可执行文件的shell函数ls等... 当然,程序可以启动/bin/ls而不必分叉shell(例如,使用简单的fork+execve ...)

还可以阅读execvp(3)environ(7)


“whereis”作为一个选择是非常糟糕的,因为它提供了可以运行的程序的超集。由于whereis首先“尝试在标准Linux位置中定位所需的程序”,而/usr/lib是其中之一,不应该在PATH中,所以很有可能会得到一个完全误导人的结果。 - msw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接