【问题标题】:Boost.Program_options: Forward parameters after '--' to another programBoost.Program_options:将'--'之后的参数转发到另一个程序
【发布时间】:2015-09-28 11:39:21
【问题描述】:

我正在编写一个 C++ 应用程序 A,它在后台调用另一个应用程序 B。一些命令行选项适用于应用程序A,但有些应该转发给B。分隔应使用双破折号--

例如:

./my_executable_A -a --long_b some_file -- -c --long_d

应该解析应用程序A中的{"-a", "--long_b", "some_file"},并在应用程序A调用时将{"-c", "--long_d"}转发给应用程序B

我认为将boost::program_options 用于该任务可能有意义,但我没有找到此功能。这可能吗?

注意:用例是libfuse 文件系统,其中一些选项将被转发到fuse_main() 函数。

【问题讨论】:

  • 前段时间我搞砸了 Boost 程序选项库,但我似乎记得有一个标志或其他东西要求库在遇到 "--" 时停止解析,并且将剩余的参数留在argc/argv
  • 您可能想在 Boost 的错误跟踪器中查看这张票:svn.boost.org/trac/boost/ticket/6991 - 还要考虑您是否愿意修改您的命令行语法,或者它是否完全固定?跨度>
  • 如果有另一种简短的语法,我愿意改用它。这个的优点是它被其他 libfuse 文件系统使用,因此是已知的。但是,它们会进行手动解析。

标签: c++ boost getopt boost-program-options


【解决方案1】:

这是默认行为(如果未记录),至少从 Boost 1.33 开始就存在; -- is considered a "terminator" 和它之后的所有命令行参数都可以作为positional options 访问:

bool a = false, b = false;
std::vector<std::string> command;
po::options_description desc("Allowed options");
desc.add_options()
        ("long_a,a", po::bool_switch(&a), "a")
        ("long_b,b", po::bool_switch(&b), "b")
        ("command", po::value(&command));
po::positional_options_description p;
p.add("command", -1);
po::variables_map vm;
po::parsed_options parsed = po::command_line_parser(argc, argv).options(desc).positional(p).run();
po::store(parsed, vm);
po::notify(vm);

【讨论】:

  • 这行得通,但“使用”打印--command arg。如何改善?
【解决方案2】:

没有对此的内置支持。我建议从整个 argv 数组中创建一个 std::vector,找到“--”,如果找到,将向量切片并将第一部分传递给 program_options(它也接受 std::vector)和第二部分到你的程序。

【讨论】:

    【解决方案3】:

    您可以选择将它们全部作为参数输入,并在“--”之后将这些参数存储在另一个 char** 中,然后发送到分叉进程。请注意,在分叉之前,您需要设置输出和输入,以便它们可以相互通信,具体取决于您希望应用程序 B 做什么

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-28
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      相关资源
      最近更新 更多