2011-04-27 42 views
4

在csh,tcsh中,bash的,perl的(等),你可以做测试看齐(不一定具有相同的语法):壳体试验二进制是否在您的路径

test -e PATH; # Does PATH exist 
test -f PATH; # Is PATH a file 
test -d PATH; # is PATh a directory 
... 

难道一个存在类似的结构来检查二进制文件是否在你的路径中? (也许无论是别名,甚至内置的存在)

显然,这可以与形式的东西来完成:

#!/usr/bin/env bash 
C=COMMAND; 
test $(which $C) -o $(alias $C) && "$C exists" 

或其他壳/脚本语言类似的东西。

问题不在于是否可以测试程序,命令等的存在。问题是内置测试是否存在。

回答

7

从技术上讲,如果你只是在寻找的东西当前PATH那么唯一的解决方法就是你的第二个代码块的第一部分:

which $C 

which是唯一一个真正适合你在当前PATHwhereis实际需要将搜索的路径之外:

whereis ...尝试在标准Linux位置列表中查找所需的程序。

whereis(1)

当然alias有你的shell环境中无关,与实际的可执行文件,而是别名命令

所以,真的,你有正确的方法已经,只是要小心,您知道whereis可能不是该测试链的有益补充。

+0

这是一个好点的重:whereis。感谢您的迅速回应。 – 2011-04-27 16:37:13

2

另一种解决方案是

find $(echo $PATH|tr : \) -maxdepth 0 -executable -name Executable 

如果可执行文件是所需应用程序的名称。 例如:

find $(echo $PATH|tr : \) -maxdepth 0 -executable -name awk 

回报

/usr/bin/awk 
/bin/awk 
3

或者只是:

type -P awk # returns the first matched binary called 'awk' in current PATH 
+1

这不是一个坏的解决方案,但它是特定于bash。此外,它在功能上与'哪个X'没有任何区别。但是,不是一个坏建议。 – 2011-04-28 15:41:09

相关问题