我正在Linux上用C语言开发一个控制台应用程序。
现在它的一个可选部分(不是必须的)依赖于一个命令/二进制文件是否可用。
如果我使用system()
检查,我会得到sh: command not found
作为不想要的输出,并且它将其检测为存在。那么我该如何检查命令是否存在?
这不是从Bash脚本中检查程序是否存在的重复问题,因为我正在使用C,而不是BASH。
我正在Linux上用C语言开发一个控制台应用程序。
现在它的一个可选部分(不是必须的)依赖于一个命令/二进制文件是否可用。
如果我使用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.
}
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");
< p > type
命令的结果比较难解析,因为其输出取决于你要查找的内容(二进制、别名、函数、未找到)。
使用 which
命令,你可以检查 system()
返回的值(如果找到则为0),或者命令的输出(无输出表示未找到):
$ which which
/usr/bin/which
$ echo $?
0
$ which does_t_exist
$ echo $?
1
which
不是一个标准命令,无法告诉你关于 shell 内置命令等信息。 - tripleee您可以在Linux(或任何POSIX操作系统)上使用stat(2)来检查文件是否存在。
如果你运行一个shell,从"type commandname"的输出可以告诉你commandname是否可用,如果可用,它是如何提供的(别名,函数,二进制路径)。你可以在这里阅读type
的文档:http://ss64.com/bash/type.html
我会遍历当前的 PATH,看看是否可以在其中找到它。这就是我最近使用程序的可选部分所需的 agrep
安装的方法。或者,如果您不信任 PATH,但有自己要检查的路径列表,请使用该列表。
我怀疑这不是您需要检查是否为内置的 shell 命令。
system()
的是什么? - arunkumarsystem("ls --version")
。至少这是我的想法。 - Cobra_Fast