如何知道命令在linux中的运行位置

如何知道命令在linux中的运行位置,linux,bash,unix,Linux,Bash,Unix,假设我在unix中运行了一个命令,如ls或rm,路径变量设置如下 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中 所以我想知道它是从哪里来的 我无法搜索所有目录并知道所有目录ls位于哪个目录。有没有一种直接的方法可以从它运行的地方

假设我在unix中运行了一个命令,如
ls
rm
,路径变量设置如下

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

所以我想知道它是从哪里来的


我无法搜索所有目录并知道所有目录
ls
位于哪个目录。有没有一种直接的方法可以从它运行的地方搜索ls呢?

只需使用它就可以准确地从哪里找到它

$ which ls
  /bin/ls

它将列出从哪个路径获取该可执行文件。因此,从上面的命令来看,我的ls命令位于/bin目录中。

在bash中运行外部命令时,bash会对该命令进行哈希运算,以避免必须执行两次路径查找。
hash
命令可以告诉您运行了哪个命令。如果该命令在哈希的生存期内没有运行,它将给出一个错误

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

$ ls foo
$ hash -t ls
/bin/ls
了解
散列
哪个
类型
命令的区别是有利的

  • hash
    告诉您使用/哈希了什么路径/命令。如果路径或文件系统在
    hash
    的生命周期内发生更改,
    hash
    可以告诉您更改之前发生的命令
  • 其中
    是一个外部命令,可在
    路径
    环境变量中查找命令
  • type
    是一个内置命令,它在本地
    PATH
    变量中查找命令,该变量可能(但几乎永远不会)与环境中的命令不同

请参阅bash中的
帮助哈希
,以了解有关其工作原理的更多信息。

除了提及
哪个
键入
哈希
的其他答案外,您还可以使用该命令(如果系统上安装了该命令)

whereis
告诉您命令应放置的标准位置

如果您的交互式shell是,您也可以使用
=ls
单词,例如
echo=ls
ls=ls
来找出shell引用的
ls

您还可以使用别名
ls
,或者使用shell函数
ls
屏蔽
/bin/ls
可执行文件,等等。。。。当然,程序可以启动
/bin/ls
,而无需分叉shell(例如,使用普通
分叉
+
执行程序
…)


同时阅读&

where is
是一个特别糟糕的选择,因为它提供了可以运行的内容的超集。因为whereis first“尝试在标准Linux位置定位所需的程序”和
/usr/lib
是这些位置之一,不应该在PATH中,它很可能会产生完全误导性的结果。
类型
可能是大多数情况下的最佳选择,因为它可以正确识别shell内置、函数和其他类似的东西。这一点起到了作用,概念也变得清晰。问题是在我当前的目录中有一个文件名为“ls”。所以实际的ls命令不起作用。使用hash命令,我可以知道它是从当前目录中选取的。而不是/bin。