我正在编写一个脚本,我需要在用户的$ 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
是否有更简单和便携的东西?
答案 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
。