2012-04-27 112 views
1

好日子,C命令行界面 - 历史之类的函数在BASH

我写一个简单的CLI(命令行界面)应用程序,它提供了一个简单的提示,可以接受来自用户的字符串,对它们进行验证,并根据输入执行某些操作。非常坦率的。

我在寻找一个独立于平台,非GPL/LGPL的手段(或者,至少是适用于POSIX兼容操作系统的东西,比如Linux,BSD等),所以我可以使用向上/向下箭头键来在CLI应用程序中前后键入的命令的历史记录中来回滚动,并将它们显示在输入行中。

目标是有效地模仿BASH和其他大多数shell中的历史功能。我想只使用上/下键并检测它们。我假设我需要使用中断或一些专门的库,尽管如此,我真的很想只用标准的ANSI C做这件事,并且必须完全避免任何第三方库。

+1

也许ncurses会以独立于平台的方式为您完成大部分工作 – 2012-04-27 19:11:41

回答

7

如果你坚持自己做,那么除了“自己动手”之外,我们没有什么可说的。这并不复杂,但也不是早晨的工作。

您应该认真考虑使用GNU readline,这是其他人(包括bash)所使用的。它做到了这一切,做得更好,并做得很好。

+1

Ps。错误的网址,请尝试http://www.gnu.org/s/readline/ – Morpfh 2012-04-27 19:30:51

+0

@Rune - 谢谢!编辑。 – 2012-04-27 21:09:32

4

您可以使用bash使用的readline库。请注意,这是GPL,因此您的代码必须是内部或GPL。有libedit这是BSD许可具有较少的功能

1

正如其他答案所述,你真的应该使用readline。否则,您将不得不使用缓冲区,并使用read()的stdin文件描述符。您将需要设置包含您的历史记录的数据结构和/或文件。另外,您可以使用execvp()和/或system()来分派命令。

4

你可以使用readline,或者你可以采取简单的路线,完全没有。当你运行你的程序时,通过rlwrap调用它,你可以免费获得历史编辑。换句话说,而不是,:

$ mytool 

你只要运行

$ rlwrap mytool 

rlwrap周围的ReadLine的包装,让您获得的readline的好处,而不做任何工作。

+0

+1我不知道'rlwrap'。我使用了相同想法的Java版本。请注意,在Windows上,控制台程序默认情况下会出现类似readline的行为! – 2012-04-27 19:28:53