我正在开发一个C ++程序,它接受一个文件名作为命令行输入,从该文件读取一堆数据,计算有关数据的两件事,然后退出。其中一个计算必须,但另一个更可选,所以我认为添加一个-c
标志来关闭它是很好的。天真地,我只是总是假设如果用户给出两个参数,第一个必须切换计算,第二个给出文件名,但是这会让更多标志更加麻烦。使rm -rf "file"
,rm -fr "file"
和rm "file" -rf
都作为有效命令工作的标准做法是什么?
答案 0 :(得分:3)
使rm -rf“file”,rm -fr“file”和rm“file”-rf都作为有效命令工作的标准做法是什么?
很多人对此持不同意见,所以似乎没有标准的做法,除非你针对特定的受众(即在编写特定于Linux的命令行工具时,请查看“标准”实用程序的功能)
无论如何,大多数图书馆最终会给你以下选项:
tar
和rm
之类的Unix工具通常允许您一起指定多个标记,就像示例的-rf
标记一样。gcc
期望在-o
之后输出文件的名称。因为他们期望选项,显然不能同时指定。-o
和--output-file
)尽管有些选项,例如帮助或详细程度控制,通常只有很长的名称。--
选项也很方便。许多工具允许交换机和选项交错,但多个尾随参数总是在最后。
当然,您会发现不遵守这些惯例的常用工具,例如Microsoft的cl.exe
和link.exe
。最近的工具似乎也趋向于这些,包括微软的candle.exe
和light.exe
为WIX。
如果您想确保遵守这些准则(并节省大量时间),请使用“标准”库,例如UNIX的getopt()
或boost的程序选项。
修改:现有库通常会使用您在指定期望的开关和选项时提供的简短说明为您生成--help
选项。
答案 1 :(得分:2)
使用boost program options。例如:
po::options_description desc("Allowed options");
desc.add_options()
("help", "produce help message")
("compression", po::value<int>(), "set compression level")
;
po::variables_map vm;
po::store(po::parse_command_line(ac, av, desc), vm);
po::notify(vm);
if (vm.count("help")) {
cout << desc << "\n";
return 1;
}
if (vm.count("compression")) {
cout << "Compression level was set to "
<< vm["compression"].as<int>() << ".\n";
} else {
cout << "Compression level was not set.\n";
}
答案 2 :(得分:1)
UNIX实用程序使用的标准参数解析函数(例如rm
)是getopt()
。较新的命令可能使用getopt_long()
,它处理多个字符(长--symbols
与短-s
)的所谓“长参数”。
有关其使用示例,请查看this implementation of rm
,或者查看手册页。
getopt()
已移植到Win32 / MFC。其中一个端口是XGetOpt。
答案 3 :(得分:0)
谷歌搜索出现了这个名为“Anyoption”的C ++类。看起来它正是您所需要的。 http://www.hackorama.com/anyoption/
您也可以随时编写自己的解析器。我希望,如果没有别的,写自己的将是一个很好的编程练习,因为它不是太难,但不是微不足道。
答案 4 :(得分:0)
或者,如果你有提升,program_options就可以实现...... http://www.boost.org/doc/libs/1_44_0/doc/html/program_options.html
答案 5 :(得分:0)
您可以在当前的Linux发行版中找到现代GNU工具来演示所需的行为。
旧的讨厌行为可以在FreeBSD和OpenBSD上默认提供的BSD工具中看到。
理想的行为是:
使用ls
的GNU版本,您可以执行此操作:
ls -al *.c -h *.h --reverse -t -- -filename-1 -filename-2
这对命令行用户来说非常好。它应该是。我们写了它。
ls
的BSD版本会扼杀它。为了改变一些显示选项,被迫导航回命令的开头是非常烦人的。