操作系统 | readline库的用处与安装方法

news/2024/10/31 7:33:01/

文章目录

  • 一、关于`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

  1. 安装g++编译库,用于处理.cpp文件
sudo apt install g++
  1. 接下来尝试编译一下代码
g++ -o shell shell.cpp -lreadline

shell.cpp是C程序文件名,shell是编译生成的可执行文件,这里用来给大家举例子

​出现类似这种报错:fatal error: readline/readline.h: No such file or directory是因为,我们的库中还不存在readline库,所以编译函数找不到相关的函数库

由于readline是一个动态库,编译的时候需要加上-lreadline,不然会找不到相关的函数

  1. 安装Ubuntu对应的readline

因为博主用的是Ubuntu,所以这里以Ubuntu来作为示例,不同的操作系统对应不同的readline库版本,大家可以去网上查一下

sudo apt install libreadline-dev

​ 如果遇到Unable to locate package报错,博主结合网络整理了以下几种方法,可以借鉴一下:

  • 第三步中的命令行输入不正确
  • 输入命令行sudo apt-get update
  • 输入命令行sudo apt-get upgrade

​ 如果还是安装不上,建议自行网上搜索,或者英语好的家人们可以访问发行readline库的官网寻求答案

  1. 重新编译一下代码
g++ -o shell shell.cpp -lreadline
  1. 编译通过,生成可执行文件

http://www.ppmy.cn/news/62536.html

相关文章

基于logback 实现springboot的日志配置

目录 一、前言 二、使用详解 2.1、打印到文件中 2.2、打印级别控制 2.3、logback 详细配置 2.4、logback 配置文件的组成 2.4.1、<root>标签 2.4.2、<contextName>标签 2.4.3、<property>标签 2.4.4、<appender>标签 2.4.5、<logger&g…

#include<fstream>

#include <fstream> 是C程序中常用的预处理指令&#xff0c;它包含了fstream库。这个库提供了用于处理文件输入/输出的类。fstream库主要包括以下几个类&#xff1a; std::ifstream&#xff1a;用于从文件读取数据的输入文件流类。std::ofstream&#xff1a;用于向文件写…

如何高清视频录制?您只需要这样操作!

案例&#xff1a;如何录制画质高清的视频&#xff1f; 【我录制了一个视频课程&#xff0c;上传到网上&#xff0c;但是我录制的视频画质不好&#xff0c;影响观感。有没有支持高清录制的录屏工具&#xff1f;有没有小伙伴可以推荐一下&#xff01;在线等&#xff01;】 无论…

人大金仓KFS全新升级,从容应对“名场面”

系统迁移升级过程中&#xff0c; 迁移停机时间长&#xff1f; 异构数据库迁移成本高&#xff1f; 数据一致性无法保证&#xff1f; 发生故障后缺乏回滚手段&#xff1f; 这些“名场面”您遇到过吗&#xff1f; KFS全新解决方案正式发布 针对用户不同应用场景出现的普遍痛点&…

2021年NOC大赛编程马拉松赛道图形化小低组模拟卷,包含答案

目录 单选题(20道/1分) 判断题(5道/1分) 自由创作题: 下载文档打印做题: 2020-2021 NOC核桃编程马拉松图形化小低组模拟卷

Redis 进阶

&#x1f972; &#x1f978; &#x1f90c; &#x1fac0; &#x1fac1; &#x1f977; &#x1f43b;‍❄️&#x1f9a4; &#x1fab6; &#x1f9ad; &#x1fab2; &#x1fab3; &#x1fab0; &#x1fab1; &#x1fab4; &#x1fad0; &#x1fad2; &#x1fad1;…

nodejs的安装以及Dos的命令

1.0 nodeJS nodejs是基于谷歌v8引擎的执行环境&#xff0c;他没有BOM、DOM nodeJS安装 找官网 ->下载 -> 傻瓜式下一步 -> win键 r -> 输入cmd 进入dos操作命令 -> node -v 查看版本 1.1 DOS 命令【掌握】 进入指定文件夹 cd 文件目录 退出到上一层 cd .…

理解FPGA的基础知识——逻辑电路

FPGA (Field Programmable Gate Aray,现场可编程门阵列)是一种可通过重新编程来实现用户所需逻辑电路的半导体器件。为了便于大家理解FPGA的设计和结构&#xff0c;我们先来简要介绍一些逻辑电路的基础知识。 1.逻辑代数 逻辑代数中的变量称为逻辑变量&#xff0c;用大写字母表…