文章目录
- 一、关于`readline`库
- 二、安装`readline`库
这里我们来讨论一下
readline
库的用处与安装方法
代码以
shell
为例,readline
实现上下键操作选择用户最近输入的 30 个命令
一、关于readline
库
简介:GNU Readline
是一个跨平台开源程序库,提供交互式的文本编辑功能。应用程序借助该库函数,允许用户编辑键入的命令行,并提供自动补全和查看命令历史等功能。Bash(Bourne Again Shell)、GDB、ftp、mail
等程序就使用Readline
库提供其命令行界面。
原理:readline
的参数是一个字符串,调用函数时会读取一行输入,然后返回一个指向输入字符串的指针,readline
会为输入的字符串动态分配内存,使用完后进行free
操作。
相关代码:
使用时需要加上的宏定义
#define CLOSE "\033[0m" //关闭所有属性
#define BLOD "\033[1m" //强调、加粗、高亮
#define BEGIN(x,y) "\033["#x";"#y"m" //x:背景,y:前景
//在非打印字符前后加上\001和\002才能解决输入太多会导致提示符被输入覆盖的问题
调用readline
库的代码
char* t=readline(BEGIN(49,34)BLOD"~$ "CLOSE);//命令提示符+接下来t读入一行字符串
//49是背景颜色,34是命令提示符的颜色,BEGIN/BLOD/CLOSE在宏定义中均有说明
实现上下键操作选择命令
add_history(t);//添加到历史文件,用于上下键
调用完readline
库后释放内存
free(t);//释放内存
完整代码:
仅实现上下键操作选择用户最近输入的 30 个命令这单一功能
string inputString;//用于存放输入的命令//注意这是个全局变量
read_history("_command_recent_.txt");//输入的历史命令存入里面//此代码可删
char* t=readline(BEGIN(49,34) "~$ " CLOSE);//命令提示符+接下来t读入一行字符串
add_history(t);//添加到历史文件,用于上下键查看
write_history("_command_recent_.txt");//写到历史文件中,可以实现本次运行时查看上次运行的命令//此代码可删
inputString=t;//把t的命令输入到inputString
free(t);//释放内存,因为已经赋值在inputString
二、安装readline
库
- 安装g++编译库,用于处理
.cpp
文件
sudo apt install g++
- 接下来尝试编译一下代码
g++ -o shell shell.cpp -lreadline
shell.cpp
是C程序文件名,shell
是编译生成的可执行文件,这里用来给大家举例子
出现类似这种报错:fatal error: readline/readline.h: No such file or directory
是因为,我们的库中还不存在readline
库,所以编译函数找不到相关的函数库
由于readline
是一个动态库,编译的时候需要加上-lreadline
,不然会找不到相关的函数
- 安装
Ubuntu
对应的readline
库
因为博主用的是
Ubuntu
,所以这里以Ubuntu
来作为示例,不同的操作系统对应不同的readline
库版本,大家可以去网上查一下
sudo apt install libreadline-dev
如果遇到Unable to locate package
报错,博主结合网络整理了以下几种方法,可以借鉴一下:
- 第三步中的命令行输入不正确
- 输入命令行
sudo apt-get update
- 输入命令行
sudo apt-get upgrade
如果还是安装不上,建议自行网上搜索,或者英语好的家人们可以访问发行readline
库的官网寻求答案
- 重新编译一下代码
g++ -o shell shell.cpp -lreadline
- 编译通过,生成可执行文件