Unix 如何以编程方式检查程序';谁的存在?

Unix 如何以编程方式检查程序';谁的存在?,unix,language-agnostic,Unix,Language Agnostic,假设我正在编写一些依赖于外部程序的东西,比如svn。如何自动检查它们是否存在,以便在它们不存在时打印有用的错误消息?通过路径进行迭代是可能的,但很难做到优雅和高效。有更清洁的解决方案吗 我在引导脚本中见过这种行为,但我不记得在哪里。它看起来有点像这样: checking for gcc... yes 如果您使用的是bash,则可以使用类型内置: $ type -f svn svn is /usr/bin/svn 如果要在脚本中使用它: $ type -f svn &>/dev/

假设我正在编写一些依赖于外部程序的东西,比如
svn
。如何自动检查它们是否存在,以便在它们不存在时打印有用的错误消息?通过
路径
进行迭代是可能的,但很难做到优雅和高效。有更清洁的解决方案吗

我在引导脚本中见过这种行为,但我不记得在哪里。它看起来有点像这样:

checking for gcc... yes

如果您使用的是bash,则可以使用
类型
内置:

$ type -f svn
svn is /usr/bin/svn
如果要在脚本中使用它:

$ type -f svn &>/dev/null; echo $?
0
$ type -f svn_doesnt_exist &>/dev/null; echo $?
1

试着打电话给它

使用
-V
或使程序报告其版本的任何其他选项来调用它最有意义;大多数时候,您希望程序至少是这样或那样的版本


如果你的程序是一个shell脚本,
哪个
也是你的朋友。

当你说“程序”时,你到底是什么意思?二进制文件?你说的是linux吗?@MostyMostacho基本上可以通过C语言中的
system()
或通过命令行调用任何东西。是的,Linux/Unix。(参见标签。)与
相比,这有什么好处?这是我通常使用的。@SanjayManohar
它是一个程序,但是
类型是一个shell内置的。此外,
type
还可以找到函数之类的东西,并可以剪切别名。例如,如果您给一个命令加别名,
键入
将告诉您该别名,而
哪个
将找不到任何内容。-1:绝对不要盲目地运行命令,除非您绝对确定运行该程序不会有害。@FooBah:如果您没有访问包系统等的权限,您只能查看给定名称的可执行文件是否存在于路径上。尝试执行将搜索
路径
,然后运行命令或返回错误。手工操作会带来什么安全性或健壮性?