2015-09-28 12 views
1

我正在寫一個C++應用程序一個調用後臺另一個應用程序。一些命令行選項適用於應用程序A,但有些命令行選項應轉發至B。分離應該使用雙破折號--Boost.Program_options:後轉發參數「 - 」到另一個程序

例如:

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

應該應用解析{"-a", "--long_b", "some_file"}並轉發{"-c", "--long_d"}到應用當由調用。

我認爲這可能是有意義的使用boost::program_options的任務,但我沒有找到這個功能。這可能嗎?

注意:該用例是一個libfuse文件系統,其中一些選項將被轉發到fuse_main()函數。

+0

前段時間,我搞砸了Boost程序選項庫,但我似乎記得有一個標誌或一些東西要求圖書館停止解析,當它打到'「 - 」',並離開剩餘的參數在'argc' /'argv'中。 –

+0

您可能想要在Boost的錯誤跟蹤器中查看此故障單:https://svn.boost.org/trac/boost/ticket/6991 - 同樣考慮您是否願意修改您的命令行語法,或者如果它是完全置於石頭? –

+0

如果有另一個簡短的語法,我願意切換到它。這個優點是它被其他libfuse文件系統使用,因此是已知的。但是,他們做手動解析。 – Heinzi

回答

2

沒有內置的支持。我推薦的只是從整個argv數組中創建一個std :: vector,找到「 - 」,如果找到,切片矢量並將第一部分傳遞給program_options(它也接受std :: vector),第二部分到你的程序。

1

你會有一個選擇是讓它們都作爲參數進來,並在' - '之後將這些參數存儲在另一個char **中,併發送到分叉進程。請注意,在分叉之前,您需要設置輸出和輸入,以便它們可以相互交談,具體取決於您希望應用程序B執行的操作。

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); 

Example

相關問題