Command line 交互式命令行实用程序实际上是如何工作的?

Command line 交互式命令行实用程序实际上是如何工作的?,command-line,terminal,Command Line,Terminal,我掌握了stdin、stdout、stderr的基本概念,以及程序如何使用命令行/终端 然而,我一直想知道Linux中的less和git log等实用程序是如何工作的,因为它们是交互式的 我目前的想法是,程序不会退出,写入stdout,侦听关键事件,并向stdout写入更多内容,直到用户退出按q或发送关闭信号 我的直觉是对的还是有更多的?他们是否检测每行的行数和字符数以确定要输出多少?他们总是在输出之前清除屏幕吗?这是一个非常有趣的问题,即使它有点开放 正如@tripleee所提到的,它是交互式

我掌握了stdin、stdout、stderr的基本概念,以及程序如何使用命令行/终端

然而,我一直想知道Linux中的
less
git log
等实用程序是如何工作的,因为它们是交互式的

我目前的想法是,程序不会退出,写入stdout,侦听关键事件,并向stdout写入更多内容,直到用户退出按
q
或发送关闭信号


我的直觉是对的还是有更多的?他们是否检测每行的行数和字符数以确定要输出多少?他们总是在输出之前清除屏幕吗?

这是一个非常有趣的问题,即使它有点开放

正如@tripleee所提到的,它是交互式CLI应用程序的基础库


一点历史。。。 终端==“打印机”…

为了理解POSIX“终端”,你必须考虑他们的历史…更具体地说,你需要想想70年代的“终端”是什么意思,在70年代,你将键盘+打印机连接到串行电缆上。键入时,一个字节流会流到主机,主机会将它们回显到打印机,从而使打印机在键入命令时回显该命令。然后,通常在按下ENTER键后,主机将关闭并执行一些工作,然后将输出发送回打印。由于它基本上是一个美化的点阵打印机,我们这里只谈附加。没有“画屏幕”或任何类似的花哨的东西

试试这个:

echo -e "Hi  there\rBye"
 echo  -e "\033[32mgreen\033[39m"
你会看到上面写着“再见”。“\r”是无换行的回车符。是在旧的点阵打印机中来回移动并实际进行打印的打印机部件。因此,如果您将滑架返回到页面左侧,并且无法推进纸张(即“换行”),那么您将开始在当前文本行上打印。“终端”=“打印机”

监视器和软件终端。。。仍然以线路为导向

所以向前闪一闪,一种叫做“监视器”的革命性技术就出现了,你有一个可以重写的虚拟终端显示器。所以像所有好的技术一样,我们通过增加越来越多的特殊转义码进行了渐进式的创新。例如,查看。如果您在一个无法识别这些转义码的终端上,您将在这些未解释代码的输出中看到一堆胡言乱语:

    "methodName": ESC[32m"newInstance"ESC[39m,
    "fileName": ESC[32m"NativeConstructorAccessorImpl.java"ESC[39m,
    "className": ESC[32m"sun.reflect.NativeConstructorAccessorImpl"ESC[39m,
    "nativeMethod": ESC[33mfalseESC[39m,
当终端看到“\033”(ESC)、“[”、…、“m”时,它会将其解释为更改颜色的命令。请尝试以下操作:

 echo  -e "\033[32mgreen\033[39m"
不管怎么说,这就是Unix终端系统的历史/遗产,然后被Linux和BSD(如Mac)继承,和半标准化为。检查一下定义了与终端交互的内核接口。几乎可以肯定的是,Linux/BSD有一系列更高级的功能,这些功能没有完全标准化到POSIX中此外,还有一系列事实上的终端设备协议标准,如古老的。软件“终端仿真器”如SSH或PuTTY知道如何使用VT100,通常还有一系列更高级的方言

在“线导向”界面上实现“交互式”…


所以…交互式…这不太适合线条打印机的世界视图。它是分层的。输入很简单;而不是自动回显键入的每个按键并等待输入(ala),我们让程序使用从TTY输入的击键。输出更复杂。尽管基本抽象是一个输出流,但有足够的转义码,您可以通过定位并在旧文本上写入新文本来重新绘制屏幕(就像我的“\r”示例)。自行实现这些都不是一件有趣的事情,特别是当您希望支持具有不同转义码的多个环境时……因此,这些库,其中ncurses是最著名的库之一。要了解如何将动态屏幕高效地渲染为面向行的TTY,请访问“网络课程黑客指南”

这是一个非常有趣的问题,即使它有点开放

正如@tripleee所提到的,它是交互式CLI应用程序的基础库


一点历史。。。 终端==“打印机”…

为了理解POSIX“终端”,你必须考虑他们的历史…更具体地说,你需要思考什么是“终端”。"这意味着在70年代,键盘+打印机连接到串行电缆上。当您键入时,一个字节流流向大型机,并将其回显到打印机,从而使打印机在您键入命令时回显该命令。然后,通常在按ENTER键后,大型机将关闭并执行一些工作,然后将输出发送回pri由于它基本上是一个美化的点阵式打印机,我们这里只讨论附加。没有“画屏幕”或任何类似的花哨的东西

试试这个:

echo -e "Hi  there\rBye"
 echo  -e "\033[32mgreen\033[39m"
您将看到它打印“再见”。\r“是一个回车,没有换行。a是一个打印机部件,在旧的点阵打印机中来回移动,并实际执行打印。因此,如果您将回车返回到页面左侧,并且无法推进纸张(即“换行”),然后开始在当前文本行上打印。“终端”=“打印机”

监视器和软件终端…仍然面向线路

所以向前闪一闪,一种叫做“监视器”的革命性技术就像所有好的技术一样,我们通过添加越来越多的特殊转义码进行了渐进式创新。例如,请查看。如果您在一个无法识别这些转义码的终端上,您将看到来自那些未被理解的转义码的输出中有一堆胡言乱语代码:

    "methodName": ESC[32m"newInstance"ESC[39m,
    "fileName": ESC[32m"NativeConstructorAccessorImpl.java"ESC[39m,
    "className": ESC[32m"sun.reflect.NativeConstructorAccessorImpl"ESC[39m,
    "nativeMethod": ESC[33mfalseESC[39m,
当你的孩子出生时