bash脚本:如何实现自己的历史记录机制?

时间:2011-02-15 12:16:55

标签: bash history interactive

我正在实现类似于MySQL客户端/usr/bin/mysql的交互式bash脚本。在这个脚本中,我需要发出各种类型的“命令”。我还需要提供一种历史机制,用户可以使用上/下箭头键滚动到目前为止输入的命令。

此处列出的代码段(Example 15-6, Detecting the arrow keys)并不完全符合我的要求。我真的想要以下内容:

  1. 上/下箭头键应以静音模式运行。意思是,它们不应该在终端上回显它们的字符代码。

  2. 但是其他键(将用于读取命令名称及其参数)不得以静默模式运行。

  3. read -s -n3的问题在于它不能满足我同时对静音模式回声模式的冲突要求,仅基于字符代码。此外,值-n3将适用于箭头键,但对于其他/常规键,它将不会“返回控制”到调用程序,直到消耗了3个字符。

    现在,我可以尝试-n1并手动组装输入,一次一个字符(哎呀!)。但基于字符代码的静音/回声模式切换问题仍然存在!

    有人在bash中试过这件事吗? (注意:我不能使用C,也不能使用Perl,Python等其他脚本语言。)

    修改

    继续Dennis的回答......你需要手动通过history -s将您想要的条目添加到您的历史记录中,就像这样......

    while read -e x; do
        history -s "$x"
        # ...
    done
    

3 个答案:

答案 0 :(得分:4)

您可以使用read -eread使用readline。它将处理您的光标键并为您维护历史记录。您还需要通过history -s手动将所需条目添加到历史记录中,如下所示:

while read -e x; do
    history -s "$x"
    # ...
done

答案 1 :(得分:2)

MySQL和Bash使用Readline库来实现这一点。也许您可以使用类似rlwraprlfe的内容?

答案 2 :(得分:2)

rlwrap有一个特殊的“一次性”模式,可以替代“read”shell命令。如果您愿意,可以在脚本中每次出现此命令都有自己的历史记录和完成词列表。

像这样使用:

REPLY=$(rlwrap -o cat)

或指定历史文件和完成词表:

REPLY=$(rlwrap -H my_history -f  my_completions -o cat)