Linux系统启动后,如果没有安装图形桌面系统,用户看到的是黑乎乎的屏幕; 根据提示输入用户名和密码后,用户可以通用命令行控制电脑执行任务。如果是登陆到了图形桌面系统,用户可以打开xterm、gnome-terminal或者konsole输入指令。有人说命令行是Linux系统难以使用以致无法普及的根源; 也有人说命令行是Linux系统的魅力所在。远离这些无意义的争论不谈,掌握命令行才能发挥Linux最大的威力。
终端(Terminal)是命令行界面的硬件层面和软件层面的载体。它与计算机关系密切,其历史可以追溯到计算机诞生之初,也随着计算机的发展而发生变化。
实体终端
vt100_terminal_all.png计算机在早期不是面向个人的,而是作为服务器为某个组织、机构甚至整个国家服务的。用户需要一个终端,通用串口线或电话线与计算机相连,才能登陆进去执行自己的伟大的计算工作; 不知道那时的程序员是否已经弄出来了游戏程序,忙里偷闲的时候,在终端里玩的不亦乐乎。
终端是一种通过字符与计算机进行信息沟通的设备,包括输入、显示、通信和处理模块等部分。终端的通信模块与计算机相连,提供终端与计算机之间的双向通信链路; 用户输入的信息通过该链路到达计算机,计算机返回的数据通过该链路到达终端,终端负责将这些显示出来。
计算机看到的是一个通信端口,但是仅仅在软件上实现通信的驱动功能是不够的,因为终端的种类很多,它们实现换行、字符颜色等特殊功能时需要在向终端发送不同的指令;所以,计算机还需要实现终端的驱动,构建设备文件 /dev/ttyX
。设备文件/dev/ttyX
为用户提供了针对终端的统一端口,编程时程序员可以忽略用户所使用的终端的具体型号,执行统一的文件操作完成终端的输入读取或输出显示内容;还可以使用系统调用ioctl或C语言库termios控制终端的行为。
Framebuffer终端
framebuffer-console.png随着个人计算机的发展,每台计算机都配置着显示器和键盘,终端成为计算机的标配。把Linux系统启动或切换到命令行界面,看到的就是计算机自身的终端,这种终端是Linux系统基于FrameBuffer实现的。FrameBuffer是Linux系统图形系统的抽象层,用于控制显示器上显示的内容。/dev/fb0
是FrameBuffer设备的设备文件。执行下面的指令
cat /dev/urandom > /dev/fb0
会将屏幕变成一个满是噪声的样子。
终端模拟器
gnome-terminal.png在Linux图形桌面中,打开的终端,比如xterm, gnome-terminal和konsole等,也是一种终端。但是,它们一般被成为终端模拟器(Terminal Emulator),因为它们都是使用软件模拟出的终端。终端的显示部分基于X Window系统实现的。
这些终端模拟器对应的终端设备一般成为Pseudoterminal,其设备文件位于/dev/pts/X
中。在终端中,使用tty
命令,可以得到当前终端对应的终端设备文件。对终端设备文件进行操作,可以实现一些有趣的结果。
打开两个终端,A对应的终端设备文件为/dev/pts/0
,B对应的终端设备文件为/dev/pts/1
。在终端A中,执行echo message > /dev/pts/1
,会在终端B中显示出message
信息。基于这个功能,可以实现不同终端的用户之间进行聊天。
其他
另一个与终端形影相随的东西是shell程序,比如sh,bash,zsh等;它负责进程的管理,比如后台运行、终止程序等,这个过程背后有一套复杂的结构,后面有时间可详细了解;可同时参考script
程序,它与Shell有着相同的基本原理。
网友评论