我目前正在设计一个linux c ++应用程序。它将从命令行运行,然后一旦运行,我需要能够发出命令来控制它的执行,理想情况如下:
$ sudo ./myapplication
APP >
APP >
APP > //just pressing return
APP > openlog test1.txt //APP will now call the openlog function
APP >
我想这是一个相对简单的任务,但我不知道为了搜索一个这样的界面会调用什么。有没有人知道可以执行此功能的库或示例?或者我是否需要使用cout和cin编写自己的?如果是这样,会有任何首选方法吗?
答案 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 ++中,您需要将您键入的内容显式映射到特定函数。
如果您打算自己动手,那么您的总体设计应该是这样的:
在反射语言中,前半部分非常简化,因为您可以将字符串直接转换为函数名称。
答案 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应用程序,并将它们用作前端。