Terminal 交互式终端应用程序的构建块

Terminal 交互式终端应用程序的构建块,terminal,Terminal,我一直在努力寻找有助于我表达所需信息的词语。我想创建一个终端应用程序,它可以“接管”终端并与之交互,比如man、less、top等等 如果我的第一个目标是创建一个应用程序,当在终端中运行时,它会根据不同的按键显示一些静态输出,然后在“q”键按下时返回命令提示符-我需要查看什么样的库/框架 我知道如何使用shell脚本和终端,但不知道上述应用程序如何在终端中实现“交互性” 抱歉说得含糊不清-就像我说的,我正在努力寻找我需要的词语来找到我需要的信息,只需要往正确的方向推一下。您正在寻求编写一个文本用

我一直在努力寻找有助于我表达所需信息的词语。我想创建一个终端应用程序,它可以“接管”终端并与之交互,比如
man
less
top
等等

如果我的第一个目标是创建一个应用程序,当在终端中运行时,它会根据不同的按键显示一些静态输出,然后在“q”键按下时返回命令提示符-我需要查看什么样的库/框架

我知道如何使用shell脚本和终端,但不知道上述应用程序如何在终端中实现“交互性”


抱歉说得含糊不清-就像我说的,我正在努力寻找我需要的词语来找到我需要的信息,只需要往正确的方向推一下。

您正在寻求编写一个文本用户界面应用程序,它提供一个全屏用户界面,而不是一台简单的滚动式玻璃电传打字机。这些应用程序将终端从滚动模式切换到光标寻址模式,并使用终端控制序列在显示屏上移动光标并设置属性和颜色

这些控制序列因终端类型而不同,并且系统上有一个terminfo数据库或一个termcap数据库,该数据库采用终端类型,如
TERM
环境变量中所指定,并将其映射到包含一组终端功能的记录。终端功能描述终端的行为方式,包括是否具有自动边距背景色擦除,并向应用程序描述设置图形格式副本控制序列用于执行各种抽象操作,如“进入突出模式”和“退出突出模式”

除此之外,还构建了
ncursesw
库,这是一个函数库,可以访问编程语言编写的编译程序,如CC++。该库有一个应用程序编程接口,其中包括各种abstract概念,如窗口和窗格。它还提供了键盘输入的抽象,该抽象根据键盘代码工作。在内部,它使用termcap/terminfo,以确定如何根据发送到终端设备的实际字符序列来呈现抽象

ncursesw
键盘输入是在将终端从标准输入模式切换到非标准输入模式的顶部分层的(在POSIX标准之前分别称为煮熟输入模式和原始输入模式)。在非规范输入模式下,终端行规程不执行规范输入模式下的所有行编辑操作。特殊字符不进行特殊处理,
读取()
系统调用不会等待换行符或其他行分隔符被行规程接收

具有讽刺意味的是,你会在万维网上看到很多doco,它们告诉你关于规范输入模式的一切,就好像它是一种标准。事实上,如果你的世界涉及全屏TUI应用程序和具有命令行编辑功能的现代Shell(使用ZLE、
libedit
readline
等库构建)如今,您的行规程几乎从未处于规范模式。规范模式不是标准,而是例外,这在很大程度上(讽刺的是)适用于您运行非交互式程序

不直接映射到字母数字字符标点符号控制字符的键由终端作为控制序列沿线路发送。termcap/TermFo数据库中的终端功能描述了读取这些控制序列的应用程序应如何映射首先触发发送它们的功能键扩展键上。由于按下退出键的人与实际控制序列之间存在歧义,因此程序必须使用定时读取执行稍微复杂的舞蹈它的输入。这是在前面提到的库中为您完成的

进一步阅读

您可能想查看库。在ncurses上(旧的,像库本身一样,但仍然是一个有用的起点。)+1…尽管对于这个特定任务,bash自己的
select
语句可能足够
expect
和一些适当的代码。