Bash 模拟终端介绍

2018-10-16 bash language

Bash 是一个交互程序,不过现在都是基于虚拟终端来实现,不同虚拟终端支持能力各有区别,这里简单介绍。

简介

在现在的 Linux 发行版本中,终端 (也被称为 Terminal 或者 Console) 是用作与主机交互的软件,不同平台的默认程序有所区别,例如 Gnome 中默认使用 Gnome Terminal 。

严格来说应该被称为 Terminal Emulator 也就是终端模拟器,通过软件模拟终端。其实最开始的时候,有单独的终端只负责与计算机交互,也就是接受键盘输入,然后将结果显示出来。

一台计算机可以有多个终端,而且有不同的型号,最经典的是 DEC 的 VT(Video-Terminal) 系列,例如 VT100、VT220 终端。 dec vt100 terminal 该终端会解析传输线上的电流,然后解析为 ASCII 值,并显示出来。

随着 PC 的出现,独立硬件的终端已经过时,通常是用软件仿真来实现,在 /usr/share/terminfo 目录下保存了 Linux 服务器所支持的终端类型。

终端类型

客户端远程连接到 Linux 服务器时,当前客户端所用的模拟终端类型就保存在了 $TERM 变量中,可以通过 echo $TERM 查看当前终端类型,也可以通过 toe -a 列出系统支持的所有终端类型。

  • vt220 相比 vt100 有更多特性,例如支持 F11F12
  • xtermvt220 的超集,也就是兼容 vt220 但有更多特性,例如前者支持颜色但是后者不支持,可在 topz 按键测试。

TermInfo

不同终端支持的能力不同,用来定制终端的外观和交互行为,主要集中在对一些快捷键 (例如 F11 F12)、颜色 (支持多少种,是否允许渐变) 等,所以,为了统一使用,提供了标准的 terminfo 数据库,其定义了不同终端支持的能力。

编译好的数据库文件保存在 /usr/share/terminfo 目录下,另外还可以检查 ncurses 的源码,通常通过如下命令查看。

----- 查看某个终端的属性
$ infocmp vt100
----- 比较两个类型终端的区别
$ infocmp vt100 vt200

在命令行中,可以通过 tput 命令操作,例如。

----- 查看当前终端支持的颜色
$ tput colors

----- 清屏
$ tput clear
----- 保存当前光标位置
$ tput sc
----- 将光标移动到第10行第13列
$ tput cup 10 13
----- 设置光标不可见
$ tput civis
----- 设置光标可见
$ tput cnorm
----- 显示输出
$ tput rc

----- 设置红色
$ tput setaf 1
----- 重置
$ tput sgr0

颜色设置

通过特定的字符序列可以设置字体格式以及颜色等信息,其格式 \033[前景色;背景色;属性m,开始为 \033 \0x1b \e 符号,也就是 ASCII 中的 <Esc>,后续的分号内的内容顺序可变,其中 \033[0m 表示恢复之前的颜色。

----- 基本文本属性
[0m    sgr0           重置所有属性
[1m    bold           粗体
[2m    dim            斜体
[3m    smso           标准
[4m    smul           下划线
[5m    blink          闪烁
[7m    rev            反向
[8m    invis          隐藏

----- 设置前景色,将3修改为4为设置背景色,同样将setaf修改为setab
[30m   setaf 0        黑色
[31m   setaf 1        红色
[32m   setaf 2        绿色
[33m   setaf 3        黄色
[34m   setaf 4        蓝色
[35m   setaf 5        样红色
[36m   setaf 6        青蓝色
[37m   setaf 7        白色
[39m   setaf 9        默认

其它

bracketed paste

当复制字符串到终端时可能会出现 \e[200~XXX\e[201~ 类似的信息,其中 XXX 是复制的内容,这实际上就是所谓的 bracketed paste mode 用于区分是复制过来还是单纯直接输出,只是有些终端可能不支持,就会直接输出。

参考