C ++命令行界面

时间:2012-10-31 23:21:00

标签: c++ linux command-line-interface

我目前正在设计一个linux c ++应用程序。它将从命令行运行,然后一旦运行,我需要能够发出命令来控制它的执行,理想情况如下:

$ sudo ./myapplication
APP > 
APP > 
APP > //just pressing return
APP > openlog test1.txt //APP will now call the openlog function
APP >

我想这是一个相对简单的任务,但我不知道为了搜索一个这样的界面会调用什么。有没有人知道可以执行此功能的库或示例?或者我是否需要使用cout和cin编写自己的?如果是这样,会有任何首选方法吗?

10 个答案:

答案 0 :(得分:13)

我推荐使用GNU readline库。它负责获取输入线的繁琐工作,并允许用户使用退格键,左箭头和右箭头等编辑其行,并使用向上箭头调用旧命令,甚至使用^ R搜索旧命令, Readline安装了类似linux的典型unix类发行版,但是如果你没有它,你可以找到它here

编辑:这是一个最小的readline示例:

#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

int main(int argc, char ** argv)
{
    while(1)
    {
        char * line = readline("> ");
        if(!line) break;
        if(*line) add_history(line);
        /* Do something with the line here */
        free(line);
    }
}

答案 1 :(得分:6)

GNU readline库非常棒,如果你想要完整的行编辑和历史记录功能,但是如果一个简单的提示就足够了(或者如果你不想要GNU许可证),那么你可以只使用标准库:

#include <iostream>
#include <string>

void process(std::string const & line);

int main()
{
    for (std::string line; std::cout << "APP > " && std::getline(std::cin, line); )
    {
        if (!line.empty()) { process(line); }
    }

    std::cout << "Goodbye.\n";
}

答案 2 :(得分:2)

我同意克里斯的评论,即用一种不反思的语言会更难。在C ++中,您需要将您键入的内容显式映射到特定函数。

如果您打算自己动手,那么您的总体设计应该是这样的:

  • 读取输入行(最有可能将cin.getline用于字符串)
  • 识别第一个单词并确定它是否映射到任何函数(例如,您可以使用简单的switch语句,哈希表等)
  • 如果它未映射到某个功能,请发布错误并重新打印提示。
  • 如果确实是地图,则必须检查该行中的其他字词。
  • 对于每个其他单词,您必须将字符串转换为您想要的任何数据类型作为函数参数逐字逐句(字符串流将在这里派上用场)。
  • 现在您必须确保您提供的参数对于您调用的函数是合法的。您可以在调用函数之前预先检查它们,也可以检查函数内部的错误。
  • 一旦您验证了您的功能名称并且参数正确(且编号正确),您就可以调用该功能。

在反射语言中,前半部分非常简化,因为您可以将字符串直接转换为函数名称。

答案 3 :(得分:2)

GNU readline是其他人提出的一个很好的选择。如果许可问题会迫使您将其排除在外,那么您应该考虑linenoise

答案 4 :(得分:1)

你必须至少部分推出自己的。 GNU readline可能会有所帮助;查看http://en.wikipedia.org/wiki/GNU_readline一个简短的程序,它是实现此目标的“骨架”,您可以在其中实际添加代码。

答案 5 :(得分:1)

你应该看看the readline library。它有一点学习曲线,但它比你自己重新创建一个完整的CLI要容易得多。检查许可,因为它可能不适合您的项目。

答案 6 :(得分:1)

有点晚了,但不管......

只是为了让您了解专为此需求而设计的 CLI工具包项目http://sourceforge.net/projects/aroyer-cli/

答案 7 :(得分:1)

请注意GNU Readline的GPL许可。 在答案中,人们提到了GNU readline的GPL许可。在这个答案中,我想强调一下GPL许可证的含义 - 新用户/开发人员可能会忽略这些许可证。

https://en.wikipedia.org/wiki/GNU_Readline

复制的文字
  

选择GPL作为GNU Readline的许可[编辑] GNU Readline是   值得注意的是,它是一个免费软件库   GNU通用公共许可证(GPL)代替GNU Lesser General   公共许可证(LGPL)。免费软件库通常是许可的   在LGPL下,例如,GNU C库,GNU gettext和FLTK。

     

选择链接到LGPL许可的应用程序的开发人员   在构建新应用程序时,库需要具有LGPL   它所使用的许可库在分发时仍属于LGPL   合并后的应用程序。合并的一部分   不包括LGPL许可库的应用程序可以保留在   原始许可证。[1]这与开发人员选择相反   在这种情况下,使用GPL许可库来创建新应用程序   整个合并后的应用程序需要获得许可   根据GPL分发时,遵守第5节的规定   GPL。[2] [3]

     

GNU Readline的GPL许可证的含义[编辑]一个重要的例子   申请改变其许可以遵守Copyleft   GNU Readline的条件是CLISP,它是Common Lisp的一个实现。   最初于1987年发布,1992年改为GPL许可证,[4]   在CLISP的一位原作者布鲁诺之间进行电子邮件交流之后   海布尔和理查德史塔曼,斯托曼在其中争辩说[5]   在CLISP中连接readline意味着Haible被要求   如果他愿意分发,则根据GPL重新许可CLISP   使用readline的CLISP的实现。[6]

     

替代命令行编辑库,这是允许的   许可可以由想要实现的软件项目使用   命令行编辑功能,但希望保持在一个   许可证。其中典型的是BSD许可的libedit。   一些应用程序,如MariaDB [7]或PHP [8],允许用户使用   在构建时选择是否与GNU Readline或与   libedit。其他命令行编辑库有两个目的:   他们有API与一些主要项目的那些一致   兼容许可条款。一个例子是Haskeline库,   它将与Haskell兼容的API暴露给格拉斯哥Haskell   编译器[9]和其他需要行编辑的Haskell项目   服务[10]

     

外部链接中列出了几个此类库的链接。

答案 8 :(得分:0)

library似乎完全符合OP的要求:

它本质上是readline库的包装器,但是将函数的参数解析/转换为各自的类型:

shpp::service svc;
svc.provide_command("my_function", [](int arg1, string arg2) -> { /* Do Something */ });
shpp::shell sh(svc);
sh.start();

它适用于函数指针和lambdas。

答案 9 :(得分:-4)

您可以将应用程序编写为TCL或python应用程序,并将它们用作前端。