Пишу консольную программу под линукс, у нее должен быть сетевой интерфейс (вэб-служба какая-нибудь), но хочу предусмотреть возможность локального управления ее работой, например, организовать ввод от пользователя команд с параметрами, но не простым чтением stdin с помощью scanf, а с возможностью редактировать команды (использовать перемещение курсора, del, backspace) и вызывать на редактирование предыдущие команды (вверх-вниз), как это делается в менеджерах консоли типа sh.
подозреваю, что эта задача не нова, но никак не могу найти библиотечку на языках C/C++, которая бы это реализовала.
Поможите, если кто знает, есть такой готовый компонент?
Здравствуйте, Romantic306, Вы писали:
R>Пишу консольную программу под линукс, у нее должен быть сетевой интерфейс (вэб-служба какая-нибудь), но хочу предусмотреть возможность локального управления ее работой, например, организовать ввод от пользователя команд с параметрами, но не простым чтением stdin с помощью scanf, а с возможностью редактировать команды (использовать перемещение курсора, del, backspace) и вызывать на редактирование предыдущие команды (вверх-вниз), как это делается в менеджерах консоли типа sh. R>подозреваю, что эта задача не нова, но никак не могу найти библиотечку на языках C/C++, которая бы это реализовала. R>Поможите, если кто знает, есть такой готовый компонент?
man readline
Re[2]: Сделать в своей консольной программе консоль с команд
Вообще говоря Вам, возможно, нужен командный процессор, интегрированный в Вашу программу. Тогда пользователь сможет не только вызвать, например, предыдущую команду, но и написать целый скрипт.
Я использую для этого библиотеку Tcl. Это не легковесное решение, зато к моим услугам целая стандартная библиотека Tcl, где есть, в том числе, и сетевые средства.
Re: Сделать в своей консольной программе консоль с командами
Здравствуйте, Romantic306, Вы писали:
R> хочу предусмотреть возможность локального управления ее работой,...с возможностью редактировать команды (использовать перемещение курсора, del, backspace) и вызывать на редактирование предыдущие команды (вверх-вниз), как это делается в менеджерах консоли типа sh.
Я вообще-то Windows-программист, но мне кажется, что будет очень "linux way", если Вы напишете просто несколько консольных утилит, которые будут посылать сообщения вашей службе. Ну и их просто вызывать из sh... И будет там редактирование, и история команд, и все такое.
А если не хочется писать большое количество утилит, сделайте единого клиента, как например, svn:
svn checkout, svn update и т.д.
Это заодно даст возможность взаимодействовать с другими утилитами ОС, например послать вывод вашей утилиты в grep, или еще куда.
Здравствуйте, Romantic306, Вы писали:
Как уже выше сказали — Readline (кроме редактирования и истории, позволяет сделать автодополнение, что тоже очень полезно). Обратите внимание, она под GPL. Значит, и ваша утилита должна быть под соответствующей лицензией.
libedit пока довольно плохо работает с UTF-8.
Если достаточно редактирования и истории, то простейшим решением будет rlwrap — обёртка, позволяющая использовать мощь Readline для ввода в любые программы. И GPL тут не обязательна. Или можно написать на баше свою обёртку, бесконечный цикл и read.