dep*_*ted 8 terminal text-user-interface
某些程序如何设置背景和字体颜色,将字符写入屏幕上的同一位置(例如第三行,第五列)不止一次?
一些示例是 显示的进度条curl google.com > a
、一些安装屏幕和几乎任何文本编辑器。
您要问的并不是真正的图形 API,而是终端控制字符。
它背后有很多历史,但当时的终端是电传打字机。基本上是一台带有轨道进纸的打字机,通过串行连接连接到计算机。键入一个字符会将二进制值发送到计算机(以及在页面上键入它)。计算机会将字符打印回作为您请求的任何输出。
特殊字符用于控制终端(这是控制键的来源,用于生成这些字符)。例如,^H
或者^?
是退格,^M
是回车(将光标移动到行首)和^J
换行(将页面向上移动一行)。一些控制代码在 C 中有一个转义序列(几乎所有编程语言都共享)来生成控制字符。前面列出的控制可能是\b
,\r
,\n
分别。
您今天使用的终端仿真器听起来就是这样,它是一种伪装成旧电传打字机的软件。从某种意义上说,这几乎就像 Unix 仍然认为您正在使用打字机与它进行通信。
在 的情况下curl
,它写入一整行然后发送\r
(回车)将光标带到该行的开头,然后写入另一行。由于没有发送换行符,它会一直在屏幕上的同一行上书写。
您可以尝试证明这一点:
echo -n "First" ; sleep 5 ; echo -en "\rSecond\n"
Run Code Online (Sandbox Code Playgroud)
您将看到打印出“First”字样(但不会发送新行)。5 秒后,它将被替换为单词“Second”并发送一个新行。您可以无限期地重复此模式。尝试自己添加“第三个”,您会看到一些您可能没想到的东西 ;-)
有关这些和其他控制字符的更多信息,请参阅ascii(7)
手册。