gpt4 book ai didi

c - 在 C/C++ 中创建 unix/linux 命令行工具的最佳实践是什么?

转载 作者:IT王子 更新时间:2023-10-29 00:25:51 24 4
gpt4 key购买 nike

我目前的任务是为我们的内部开发团队创建一些命令行帮助实用程序以供使用。但是,我想知道创建 unix 命令行工具的最佳实践。我试过查看 git source code有关如何读取参数并相应地显示消息的示例。但是,我正在寻找一个清晰的模板来创建工具、安全地读取参数以及在用户键入不正确的参数或我想显示的 --help 时显示标准的“帮助”消息帮助信息。是否有用于读取 -abcFGH--parameter 并根据传递的参数切换启动哪个进程的标准库?

命令行:

git

git --help

输出:

usage: git [--version] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
[-c name=value] [--help]
<command> [<args>]
...

命令行:

MyTool CommandName --CommandArgs

输出:

无论该特定命令做什么。


目前我的工作:

代码:

int main(int argc, char **argv)
{
if(argc < 2)
helpMessage();
char* commandParameter = argv[1];
if (strncmp(argv [1],"help", strlen(commandParameter)) == 0)
helpMessage();
else if (strncmp(argv [1],"pull", strlen(commandParameter)) == 0)
pull();
else
helpMessage();
}

理想的情况应该是这样的:

代码:

int main(int argc, char **argv)
{
MagicParameters magicParameters = new MagicParameters(argv);
switch(magicParameters[1])
{
case command1:
Command1();
break;
case ...

case help:
default:
HelpMessage();
break;
}
}

最佳答案

getopt_long() 就是你要找的,下面是一个最简单的用法示例:

   static const struct option opts[] = {
{"version", no_argument, 0, 'v'},
{"help", no_argument, 0, 'h'},
{"message", required_argument, 0, 'm'},
/* And so on */
{0, 0, 0, 0 } /* Sentiel */
};
int optidx;
char c;

/* <option> and a ':' means it's marked as required_argument, make sure to do that.
* or optional_argument if it's optional.
* You can pass NULL as the last argument if it's not needed. */
while ((c = getopt_long(argc, argv, "vhm:", opts, &optidx)) != -1) {
switch (c) {
case 'v': print_version(); break;
case 'h': help(argv[0]); break;
case 'm': printf("%s\n", optarg); break;
case '?': help(argv[0]); return 1; /* getopt already thrown an error */
default:
if (optopt == 'c')
fprintf(stderr, "Option -%c requires an argument.\n",
optopt);
else if (isprint(optopt))
fprintf(stderr, "Unknown option -%c.\n", optopt);
else
fprintf(stderr, "Unknown option character '\\x%x'.\n",
optopt);
return 1;
}
}
/* Loop through other arguments ("leftovers"). */
while (optind < argc) {
/* whatever */;
++optind;
}

关于c - 在 C/C++ 中创建 unix/linux 命令行工具的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13691715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com