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

假设我在Unix中运行了一个像lsrm这样的命令,pathvariables如下所示

 PATH=$JAVA_HOME/bin:.:$ORACLE_HOME/bin:/sbin:/usr/sbin:/usr/bin:/usr/ccs/bin:$COBDIR/bin:/sbin:/bin:/usr/local/bin:/bin 

我们怎么能知道ls命令从哪个path运行? ls (只是一个例子)可能在/sbin/usr/bin

所以我想知道它从哪里跑?

我无法search所有的目录,并知道所有目录ls躺在哪里。 有没有一种直接的方式来从它运行的地方searchls

在bash中运行外部命令时,bash会散列该命令以避免必须执行两次路径查找。 hash命令可以告诉你哪个命令运行。 如果该命令没有在散列的生命周期中运行,则会发生错误。

 $ hash -t ls -bash: hash: ls: not found $ ls foo $ hash -t ls /bin/ls 

知道hashwhich type命令是不同的,这是很有好处的。

  • hash告诉你什么路径/命令使用/散列。 如果您的PATH或文件系统在hash的生命周期中发生变化, hash可以告诉您有关发生变化之前发生的命令。
  • which是一个在PATH环境变量中查找命令的外部命令。
  • type是一个内置命令,它在本地PATH变量中查找一个命令,这个命令可以(但几乎不会)与环境中的不同。

在你的bash中查看help hash来阅读更多关于它是如何工作的。

只要使用哪个来确定它将从哪里拿起

 $ which ls /bin/ls 

它将列出从哪个路径拾取可执行文件。 所以从上面的命令,我的ls命令是在/ bin目录。

除了其他的回答,提到which typehash你也可以使用whereis(1)命令(如果它安装在你的系统上)。

whereis告诉你一个命令应该在的标准地方。

如果您的交互式shell是zsh ,那么也可以使用=ls这个词,例如echo =lsls =ls来找出哪个ls被shell引用。

你也可以别名ls ,或者有一个shell函数来取代/bin/ls可执行文件等。当然,程序可以在分叉shell的情况下启动/bin/ls (例如用普通fork + execve … )

另请参阅execvp(3) & environ(7)