假设我在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
也可以/usr/bin
({1}}
所以我想知道它在哪里跑?
我无法负担搜索所有目录并知道所有目录ls
所在的位置。有没有直接的方法来搜索ls
从哪里开始?
答案 0 :(得分:6)
当您在bash中运行外部命令时,bash会对该命令进行哈希处理以避免必须执行两次路径查找。 hash
命令可以告诉您运行了哪个命令。如果该命令尚未在哈希的生命周期中运行,则会出错。
$ hash -t ls
-bash: hash: ls: not found
$ ls foo
$ hash -t ls
/bin/ls
了解hash
,which
和type
命令的不同之处是有利的。
hash
告诉您 使用/散列的路径/命令。如果您的PATH或文件系统在hash
生命周期内发生变化,hash
可以告诉您在更改之前发生的命令。which
是一个外部命令,用于在PATH
环境变量中查找命令。type
是一个内置命令,用于在本地PATH
变量中查找命令,该命令可以(但几乎没有)与环境中的命令不同。请参阅bash中的help hash
,详细了解其工作原理。
答案 1 :(得分:4)
只需使用哪个来定位从
中拾取的确切位置$ which ls
/bin/ls
它将列出从中获取该可执行文件的路径。所以从上面的命令,我的ls命令在/ bin目录中。
答案 2 :(得分:0)
除了提及which
,type
,hash
的其他答案之外,您还可以使用whereis(1)命令(如果它已安装在您的系统上)。
whereis
告诉您命令所在的标准位置。
如果您的互动外壳为zsh,您还可以使用=ls
字词,例如echo =ls
或ls =ls
找出shell提到的ls
。
你也可以别名ls
,或者有一个shell函数ls
来设置/bin/ls
可执行文件等等......当然,程序可以启动/bin/ls
< em>没有分支shell(例如,使用普通fork
+ execve
...)
另请阅读execvp(3)&amp; environ(7)