发现了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脚本或者命令行程序就会非常轻松了 :]