在$ PATH上找到一个命令

时间:2011-09-01 23:16:02

标签: path sh

我正在编写一个脚本,我需要在用户的$ PATH上查找命令并获取该命令的完整路径。问题是我不知道用户的登录shell是什么,或者他们的do文件中可能有什么奇怪的东西。我正在使用bourne shell作为我的简单小脚本,因为它需要在一些可能没有bash的旧Solaris平台上运行。

“which”和“whence”的某些实现将获取用户的点文件,并且这对所有用户来说都不是真正可移植的。我喜欢一个简单的UNIX实用程序,它只能执行扫描PATH以获取可执行文件并报告第一个匹配的完整路径的基本工作。

但我会满足于对所有用户都稳定的任何/ bin / sh解决方案。

我正在寻找一种比编写我自己的/ bin / sh循环更好的解决方案,它可以切断$ PATH并一次搜索一行。看起来这很常见,应该有一种可重复使用的方法。

我对“漫长道路”的第一个近似是:

   IFS=:
   for i in $PATH; do
      if [ -x $i/$cmd ]; then
          echo $i/$cmd
      fi
   done

是否有更简单和便携的东西?

3 个答案:

答案 0 :(得分:3)

答案似乎是内置的“类型”。

% /bin/sh
$ type ls
ls is /bin/ls

答案 1 :(得分:0)

也许whereis命令对你有用吗?

whereis -b -B `echo $PATH | sed 's/:/ /g'` -f [commands]

e.g。在我的电脑上,这有效:

whereis -b -B `echo $PATH | sed 's/:/ /g'` -f find man fsc

结果:

find: /usr/bin/find
man: /usr/bin/man
fsc: /opt/FSharp-2.0.0.0/bin/fsc.exe /opt/FSharp-2.0.0.0/bin/fsc

来自whereis手册页的一个警告:

   Since whereis uses chdir(2V) to run faster, pathnames given
   with the -M, -S, or -B must be full; that is, they must begin
   with a `/'.

答案 2 :(得分:0)

此问题在此详细解答:https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then。底线:使用UTF-8