【问题标题】:C Command-line interface - History function like in BASHC 命令行界面 - BASH 中的历史功能
【发布时间】:2012-05-08 13:06:50
【问题描述】:

早安,

我正在编写一个简单的 CLI(命令行界面)应用程序,它提供一个简单的提示,可以接受来自用户的字符串、验证它们并根据输入执行某些操作。相当简单。

我正在寻找一种独立于平台的非 GPL/LGPL 手段(或者,至少适用于 POSIX 兼容的操作系统,如 Linux、BSD 等),因此我可以使用向上/向下箭头键滚动在我的 CLI 应用程序中以前键入的命令的历史记录中来回切换,并让它们出现在输入行中。

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

【问题讨论】:

  • ncurses 可能会以独立于平台的方式为您完成大部分工作

标签: c linux bash shell command-line


【解决方案1】:

如果你坚持自己做,那么我们只能说“自己做”;它不是非常复杂,但也不是早上的工作。

您应该非常认真地考虑使用GNU readline,这是其他所有人(包括bash)使用的。它做到了所有这些,而且做得很好。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      正如其他答案所述,您确实应该使用 readline。否则,您将不得不使用缓冲区,并将标准输入文件描述符与read() 一起使用。您将需要设置一个包含您的历史记录的数据结构和/或文件。此外,您可以使用execvp() 和/或system() 来调度命令。

      【讨论】:

        【解决方案4】:

        您可以使用 readline,或者您可以采取简单的方法,并且什么也不做。当你运行你的程序时,通过 rlwrap 调用它,你就可以免费获得历史编辑。换句话说,而不是:

        $ mytool
        

        你只是跑

        $ rlwrap mytool
        

        rlwrap 是 readline 的包装器,它允许您在不做任何工作的情况下获得 readline 的好处。

        【讨论】:

        • +1 我不知道rlwrap。我使用过相同想法的 Java 版本。请注意,在 Windows 上,控制台程序默认获得类似 readline 的行为!
        猜你喜欢
        • 2013-12-25
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        相关资源
        最近更新 更多