Пользовательская интерактивная оболочка - PullRequest
2 голосов
/ 22 июня 2010

Я столкнулся со следующей проблемой: моя консольная утилита должна работать как процесс (надеюсь, это правильный термин), поэтому каждая команда обращается к ней напрямую.Как и gnuplot, интерактивные оболочки (irb и т. Д.).

Это показывает, о чем я говорю:

Mikulas-Dites-Mac-2:Web rullaf$ command
Mikulas-Dites-Mac-2:Web rullaf$ irb
>> command
NameError: undefined local variable or method `command' for main:Object
    from (irb):1
>> exit
Mikulas-Dites-Mac-2:Web rullaf$

first command выполняется как команда оболочки, но после вводаirb, это не так.Вы понимаете, что.

irb переводит консоль в какой-то специальный режим, или он просто анализирует сам ввод в некотором цикле?Есть ли какой-нибудь правильный способ создать такое поведение в C ++?Спасибо

Ответы [ 2 ]

2 голосов
/ 22 июня 2010

Для анализа вашей командной строки вы можете использовать Boost.Program_options .

2 голосов
/ 22 июня 2010

Вы должны разобрать вход самостоятельно. В зависимости от сложности входных данных, это может быть достигнуто простым совпадением строк в тривиальных случаях. Очень простой пример:

#include <iostream>
#include <string>

int main()
{
  std::string input;
  for(;;)
  {
    std::cout << ">>";
    std::cin >> input;
    if(input=="exit")
      return 0;
    else if(input=="test")
      std::cout << "Test!\n";
    else
      std::cout << "Unknown command.\n";
  }
}

Очевидно, что эта маленькая программа напечатает подсказку (>>) и поймет команды exit и test и напечатает Unknown command. для всех остальных команд.

Во всем остальном вы, вероятно, захотите узнать больше о сопоставлении с образцом или разборе; Google - ваш друг (посмотрите на бизон и хороший учебник ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...