前几天社团招新摆摊,打算用 Node.js 做个基于命令行的简单的抽题程序(大一上C语言课作业水平)
期间遇到个问题,作为一个活动用的抽题程序,抽完的题目不能留在界面上,否则就相当于透答案了,所以需要有个清空屏幕的指令。在 Windows 系统,清空指令可以简单地通过执行 cmd 自带的 cls
命令来完成(C 语言用 system("cls");
)。但在 Linux 并没有 cls
,与之对应的是 clear
命令,所以我直接用类似 system("clear");
这样的语句就好了?
准备采取这个方案之前,无意中楼主开始好奇一个问题:Linux 的 clear
命令是怎么实现的呢?
用 Linux 的时间长了,大概有这样的一个印象:终端只是一个壳而已,命令是通过 shell 来处理的,我用 bash 可以 clear,用 zsh 也能 clear。运行 whereis clear
命令,也可以发现这个命令实际上是路径为 /usr/bin/clear
的可执行文件。所以是 clear 程序和终端之间有什么通信的方式?
突发奇想,运行 clear > out.txt
把命令的输出重定向到了 out.txt
上,然后打开这个文件,发现了一些神奇的字符。
直接把这个文件输出,竟和直接运行 clear
一样的效果!
看来程序是通过输出一些神奇的特殊字符来实现与控制终端的。
开始一番搜索,其中发现了一台型号为 VT100 的就叫终端的机器。VT100 - Wikipedia
原来这就是最原始的 stdio
啊哈哈哈
另外还有刚刚遇到的一系列神奇字符的说明表:
ANSI/VT100 Terminal Control
试着在终端里面运行 echo "\033c"
,同样也实现了清屏功能。直接运行 cat
,按 Esc 键(也就是\033所转义的)和 c ,回车,发现也清屏了。
所以这和我们平常使用的终端软件有什么区别呢,带着这个问题,翻到了 Ubuntu 自带的 gnome-terminal 的帮助文档。
心中也有了一个大概的印象,所以,那个抽题的程序,就不用研究怎么在 Node.js 平台像 C 语言的 system 函数一样运行外部命令了,直接 console.log("\033c");
就完事儿。
不禁感慨,虽说终端机早已停产,但是通过终端模拟器软件, CLI 仍然在这个世界上继续发挥着独特但又至关重要的作用。