【问题标题】:How to check if command is available or existant?如何检查命令是否可用或存在?
【发布时间】:2011-11-05 13:34:05
【问题描述】:

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

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

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


不是 Check if a program exists from a Bash script 的副本,因为我使用的是 C,而不是 BASH。

【问题讨论】:

  • 你要传递什么给system()
  • 我通过版本选项传递程序名称,例如system("ls --version")。好吧,至少这是我的想法。
  • 在安装时检查所有依赖的命令/包版本不是更有意义吗?如果在编译/安装应用程序时它们就在那里,您可能可以合理地假设它们在运行时就在那里。如果您计划分发它,那么在发行说明/手册页中列出您的所有假设可能是一个好主意。如果你这样做了,你可以只关心在发行版特定的安装脚本中搜索这些东西。
  • 正如我在问题中所说,我将该功能用于我项目的一个完全可选的部分。我不希望人们仅仅因为安装了这个“依赖”就需要重新编译我的项目。
  • 好吧,他们不需要编译(除非他们愿意)。您仍然可以分发预编译的二进制文件。我只是说大多数应用程序通过在安装时检查每个发行版的依赖关系来处理这个问题。这样,您可以使用受支持的发行版上可用的任何工具来检查依赖关系。如果您项目的这一部分是可选的并且单独安装,那么您将在安装它时运行相应的检查。

标签: linux command system


【解决方案1】:

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

我怀疑你需要用 shell 检查它是否是内置的。

【讨论】:

    【解决方案2】:

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

    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 命令的结果有点难以解析,因为它的输出取决于您要查找的内容(二进制、别名、函数、未找到)。

    【讨论】:

    • whereis 有时是where,最好直接使用which
    【解决方案3】:

    如果您运行 shell,“type commandname”的输出将告诉您 commandname 是否可用,如果可用,它是如何提供的(别名、函数、二进制文件路径)。您可以在此处阅读type 的文档:http://ss64.com/bash/type.html

    【讨论】:

      【解决方案4】:

      使用which,可以查看system()返回的值(如果找到则为0)或命令的输出(没有输出等于未找到):

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

      【讨论】:

      • which 不是标准命令,无法告诉您有关 shell 内置等的信息。
      【解决方案5】:

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

      【讨论】:

      • 很难使用 stat 搜索文件,因为它可能安装在非标准位置。
      • 这并不难,因为 system() 使用 $PATH。在 $PATH 中搜索所有路径非常简单。
      • 一个简单的循环和字符串连接就可以完成这项工作。伪 C: for (int i = 0; i
      猜你喜欢
      • 2015-04-07
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2018-12-25
      相关资源
      最近更新 更多