rlwrap – 命令行下readline的封装

发现了rlwrap这个好东西。

在Mac OS和Linux下一直都用bash,bash下命令的输入都是通过readline这个库来处理的。也就是说,上下箭头查看历史命令,Ctrl+r反向查找匹配历史输入,以及Ctrl+w, Ctrl+a等等操作都是由readline提供的。rlwrap提供了readline的封装!

rlwrap runs the specified command, 
intercepting user input in order to provide readline's line editing, 
persistent history and completion.

也就是说rlwrap提供一个输入环境,在这个输入环境下可以使用readline的各种功能。如果一个程序在命令行下接受输入,那么用rlwrap直接就可以得到像在bash下输入那样的效果。

比如一个简单的反转输入行的程序

#include 
#include 
#include 

int main(int argc, char **argv)
{
    using namespace std;
    string str;
    cout << "[I] ";
    while (getline(cin,str))
    {   
        reverse(str.begin(), str.end());
        cout << "[O] " << str << endl;
        cout << "[I] ";
    }   
    return 1;
}

编译之后执行

$./a.out 
[I] a + b + c + d
[O] d + c + b + a
[I]

输入完一行,按上箭头是没有回滚到上一条命令这种效果的,更不用说行头行尾跳转了。

如果通过rlwrap输入

$rlwrap ./a.out 
[I] a + b + c + d
[O] d + c + b + a

再试试上下箭头,就和其他使用了readline的程序一致了!

对于一些没有提供readline操作的程序,rlwrap就是必备工具!
以后再写需要交互的bash脚本或者命令行程序就会非常轻松了 :]