如何以编程方式检测Linux或OS X中的可用实用程序

如何以编程方式检测Linux或OS X中的可用实用程序,linux,macos,bash,shell,cygwin,Linux,Macos,Bash,Shell,Cygwin,可能重复: 在命令行上输入(例如,type vimdiff(或如果机器上没有type,输入哪个vimdiff)。但在脚本中,检查实用程序并根据其可用性采取某些操作的最可靠方法是什么 如果有助于了解的话,目前的目的是我正在编写一个函数,thediff,我可以将它安装在各种操作系统和各种风格的操作系统的本地和远程计算机上,并让它将参数传递给p4merge(如果它可用)(适用于OS X和Windows/Cygwin环境),如果没有,则尝试使用vimdiff,如果可用,则使用该选项;如果没有,则默认

可能重复:

在命令行上输入(例如,
type vimdiff
(或
如果机器上没有
type
,输入哪个vimdiff
)。但在脚本中,检查实用程序并根据其可用性采取某些操作的最可靠方法是什么

如果有助于了解的话,目前的目的是我正在编写一个函数,
thediff
,我可以将它安装在各种操作系统和各种风格的操作系统的本地和远程计算机上,并让它将参数传递给p4merge(如果它可用)(适用于OS X和Windows/Cygwin环境),如果没有,则尝试使用
vimdiff
,如果可用,则使用该选项;如果没有,则默认为
diff
,并使用我的首选选项(例如,
--并排--抑制公用行--忽略空格更改

由于
以其提供的反馈形式来说是出了名的不可靠,我不确定如果没有安装相关的实用程序,我是否可以指望
$?
1
。但另一方面,我不确定我是否可以依赖安装的
类型

这似乎很难理解,但试一试第一个实用程序,如果
$?
为非零,那么试一试下一个,等等

这通常是如何处理的

更新

虽然我确实用“bash”来标记它,但这只是为了引起跟随bash标记的人们的注意,因为他们可能知道答案。我并不是想暗示我只使用bash,或者我可以假设bash将出现在我使用的所有系统上。事实上,我不得不在系统上工作,在这些系统中,脾气暴躁的系统管理员使得除了KornShell之外的任何东西都很难使用。并且(只要可用)我使用zsh而不是bash。因此,这不是的完全复制,因为这需要bash。所以问题是不同的。此外,我明确表示,我必须使用
类型
不可用的系统。所有的密友显然都忽略了这一事实


如果我提到的所有系统实际上都符合POSIX,那么这个问题可能是另一个问题的合理重复。我不知道它们是否正确。

如果找不到文件,哪个
会将1返回到
$?
。有关详细信息,请参见
man which
。是的,我在问题中提到了这一事实,但由于
which
是出了名的不可靠,并且通常不被接受,我可以相信所有OSs和所有发行版的所有版本都会这样吗?如果您需要跨
POSIX
兼容性,可以使用
command-v
,它是
POSIX
的一部分,当找不到该命令时返回>0。我不确定是否所有Linux发行版、OS X、,可以假设Cygwin都是POSIX兼容的。他们可以吗?@iconoclast它存在于bash版本1.14.7中。我找不到能追溯到它真正引入的时间的变更日志。最有可能发生在20世纪90年代初。