在$PATH上查找命令

在$PATH上查找命令,path,sh,Path,Sh,我正在编写一个脚本,我需要在用户的$PATH上查找一个命令,并获得该命令的完整路径。问题是我不知道用户的登录shell是什么,或者他们的do文件中可能有什么奇怪的东西。我将BourneShell用于我的简单小脚本,因为它需要在一些可能没有bash的旧Solaris平台上运行 “which”和“whence”的一些实现将源于用户的点文件,这并不是所有用户都可以移植的。我想要一个简单的UNIX实用程序,它只需完成扫描可执行文件路径并报告第一次匹配的完整路径的基本工作 但我会接受任何对所有用户都稳定的

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

“which”和“whence”的一些实现将源于用户的点文件,这并不是所有用户都可以移植的。我想要一个简单的UNIX实用程序,它只需完成扫描可执行文件路径并报告第一次匹配的完整路径的基本工作

但我会接受任何对所有用户都稳定的/bin/sh解决方案

我正在寻找一种比编写自己的/bin/sh循环更好的解决方案,该循环切碎$PATH并一次搜索一行。这似乎很常见,应该有一种可重用的方法来实现

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


是否有更简单和可移植的功能?

也许
where Is
命令适用于您

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 `/'.

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

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

此问题的详细答案如下:。一句话:使用
命令-vls

您需要担心他们所有的点文件等吗?在脚本运行时,用户不是已经在shell中了吗?Aka,这些文件将已经被源化?问题是如果我的.profile仅为ksh设置,而我的sh脚本最终将其源化为运行“which”或“whence”命令的一部分。“我的Solaris 11”框上的“whence”手册页指的是一个内置的ksh。我正在寻找一种可移植的方法。一个好的答案是,如果有人能向我保证内置的“whence”是可靠的,不依赖于任何点文件,并且可以移植到“/bin/sh”的Linux和Solaris实现中。另一个很好的答案是指向一个我从未听说过的满足相同条件的不同命令的指针。“type”命令可能就是我要找的。作为对您的近似值的评论,虽然它不如使用
type
,但它本身就是一个相当好且简洁的脚本。但是,如果成功(找到命令),它应该注意将其退出代码设置为0,否则设置为1。除非我添加/usr/ucb包,否则我的Solaris设备上似乎没有“whereis”。似乎编写可移植脚本的最大技巧是理解可以使用的外部二进制文件的子集。非常简洁!你有时会说[命令]是散列的吗
$type find find是散列的(/usr/bin/find)
我还没有看到这样的输出。我确实在ksh中看到了这一点:ls是/bin/ls的跟踪别名。我只关心可能以/bin/sh的名称运行的shell的输出。因为这是我在#上使用的!线路。
% /bin/sh
$ type ls
ls is /bin/ls