如何检查命令是否可用?

我在linux上开发一个控制台应用程序。

现在它的一个可选部分(它不是必需的)依赖于可用的命令/二进制文件。

如果我检查system()我得到sh: command not found不需要的输出,它检测到它存在。 那么如何检查命令是否在那里?


不是重复检查一个程序是否存在于Bash脚本中,因为我正在使用C而不是BASH。

回答关于如何发现命令是否存在于您的代码中的问题。 您可以尝试检查返回值。

 int ret = system("ls --version > /dev/null 2>&1"); //The redirect to /dev/null ensures that your program does not produce the output of these commands. if (ret == 0) { //The executable was found. } 

你也可以用popen来读取输出。 结合其他答案中建议的whereis和type命令,

 char result[255]; FILE* fp = popen("whereis command", "r"); fgets(result, 255, fp); //parse result to see the path of the bin if it has been found. pclose(check); 

或者使用类型:

 FILE* fp = popen("type command" , "r"); 

type命令的结果有点难以解析,因为它的输出取决于你在找什么(二进制,别名,函数,找不到)。

您可以在Linux(或任何POSIX操作系统)上使用stat(2)来检查文件是否存在。

使用which ,你可以检查system()返回的值(如果找到0)或者命令的输出(没有输出等于not found):

 $ which which /usr/bin/which $ echo $? 0 $ which does_t_exist $ echo $? 1 

如果你运行一个shell,“type commandname”的输出将告诉你命令名是否可用,如果是的话,它是如何提供的(别名,函数,二进制路径)。 您可以阅读这里的文档type : http : //ss64.com/bash/type.html

我只想通过当前的路径,看看你是否能在那里找到它。 这就是我最近用一个需要安装agrep的程序的可选部分agrep 。 或者,如果您不信任PATH,但是有自己的路径列表来检查,请使用该路径。

我怀疑这是你需要检查壳是否是内置的东西。