第1页:第七章Unix键盘使用
本页为第七章Unix键盘使用的章节封面,标示本章讲解的终端类型识别、键盘信号与键映射修改。
第2页:本章需要解决的几个问题
- 为什么Unix习惯使用“tty”指代终端?
- 为什么Unix习惯使用“print”指代在显示器上显示数据?
- 术语“deprecated(不推荐)”意味着什么?
- Unix如何知道正在使用的是哪个终端?
第3页:7.1最初的Unix终端
- Unix刚开发出来时使用的终端:-Teletype-20世纪60年代-70年代,所有非IBM的计算机使用的都是ASR33终端ASR33键盘纸带穿孔机纸带阅读机
第4页:最初的Unix终端:ASR33的键盘的组
- ASR33的键盘的组成-26个字母-0-9的数字
- 常见的标点符号
- 几个特殊键,用于发送和接收消息<Esc><Ctrl><Shift><Tab><Return>
第5页:7.2 Teletype和Unix文化
- 技术的延续和影响-Unix中,会发现很多基于20世纪70年代的技术,特别是许多思想基于早期终端的特点。这就是Unix的文化传承。下面给出两个常见的例子。
第6页:Teletype和Unix文化
- tty-Teletype终端在使用时,被称为TTY。-虽然Teletype终端的时代已经过去很久了,Unix中依然使用“tty”作为终端的符号,尤其是在文档和命令的名称中:tty:显示终端名称stty:显示或改变终端的设置getty:打开与一个终端的通信,并启动登录进程
第7页:Teletype和Unix文化
- print-Teletype终端的输出是在纸带上,因此Unix中习惯用print描述信息的输出。-在出现显示器后,依然使用“print”表示信息在屏幕上的输出。-打印时,使用什么术语呢?System V使用lp(line printer)BSD使用lpr
第8页:Termcap、Terminfo
- 终端的变化对程序的影响-程序如何需要输出信息,需要确定使用的是什么类型的终端,根据终端确定使用的命令
第9页:Termcap、Terminfo
本页为课件示意图,图中可见:程序1终端1终端2终端3程序2最初的程序访问终端的方。
第10页:Termcap、Terminfo
本页为课件示意图,图中可见:程序1终端1终端2终端3程序2改进的程序访问终端的方。
第11页:Termcap、Terminfo
本页为课件示意图,图中可见:程序1终端1终端2终端3程序2继续改进的程序访问终端。
第12页:Termcap、Terminfo
本页为课件示意图,图中可见:程序1终端1终端2终端3程序2改进数据库和APITe。
第13页:Termcap、Terminfo
- 终端信息可能存放的位置/usr/share/terminfo//usr/lib/terminfo//usr/share/lib/terminfo//usr/share/misc/terminfo
第14页:Termcap、Terminfo
- 查看终端信息1. less /etc/termcap2. terminfo信息已经被编译,无法直接查看,可以使用命令infocmp
第15页:Termcap、Terminfo
- deprecated(不推荐)看到这个注释时,意味着被注释的特性很有可能在产品的未来版本中消失
第16页:7.4 Unix如何知道所使用终端的类型
- 最初需要用户告诉Unix正在使用的终端类型
- 现在,使用的终端已内置在计算机中,Unix可以完全了解终端的状况
- 如果使用仿真终端进行远程登录,仿真终端程序可以告诉主机它们正在模仿的终端的类型。
第17页:Unix如何知道所使用终端的类型
- 为了记录终端类型,Unix使用了全局环境变量:TERM。查看TERM的值可以使用下面命令:echo $TERM
第18页:7.5修饰键:
- <Ctrl>通常和字母组合在一起,形成组合键
- 在Unix社区中,<Ctrl>使用简记: ^例如<Ctrl+A>简记为^A
第19页:7.6 Unix键盘信息
第20页:7.6 Unix键盘信息示意图
本页为课件示意图,图中可见:例子终端17.6 Unix键盘信息intr信号<Ct。
第21页:7.7键入过程中使用的信号
- 三个信号:erase、werase、kill-erase:删除最后一个键入的字符-werase:删除最后一个输入的单词-kill:删除当前行
第22页:键入过程中使用的信号
- 三个信号的映射备注键信号Macintosh使用<Delete>,其它键盘使用<Backspace><Backspace>/<Delete>erase^Wwerase^X/^Ukill
第23页:和
- Teletype中如何删除字符-需要使用两个Teletype命令:BS和DEL-首先按下^H,向纸带打孔机发送一个BS(Backspace)命令,使打孔机回到前一行-然后,按<Rubout>键,发送DEL命令,废除当前行-但是,对于Unix系统来说,捕获哪个键来确认收到一个erase信号?
第24页:和
本页为课件示意图,配合图形说明7.8 <Backspace>和<Delete>小节的结构与流程。
第25页:和
BSDELDELUnix信号处理eraseBS??Unix系统
第26页:和
- ^H和<Rubout>,哪个应该映射到erase?-一部分人选择了^H,并很快为^H单独设了一个键:<Backspace>,这个键映射到erase;-另一部分人选择了<Rubout>键,但觉得意思不够明确,将<Rubout>改名为<Delete>。
第27页:和
- ^?-在Unix文档中,将BS码记为^H,将DEL码记为^?
第28页:和
- 哪个键可用?-如果键盘上只有<Backspace>键,则它映射到erase信号-如果键盘上只有<Delete>键,则它映射到erase信号-如果键盘上既有<Backspace>键,也有<Delete>键,如Sun公司的键盘,则<Backspace>等同于^H,<Delete>等同于^?
第29页:和
- PC机键盘上的<Delete>键-现代PC键盘上的键,是1981年8月IBM PC刚生产出来的时候定义的,新增了<Insert>,<Delete>, <Pageup>, <Pagedown>等键。-PC键盘上的<Delete>键,与旧终端、Macintosh机、Sun公司机器上的<Delete>键含义完全不同。
第30页:7.9神秘字符^H
- 为什么神秘?-如果你正在使用远程主机,发现输入错误,连续按<Backspace>键,发现没有删除最后几个输入的字符,而是在屏幕上显示:^H ^H ^H
第31页:7.9神秘字符^H:为什么会这样
- 为什么会这样?本地PC^H远程主机^Herase^?erase^H
第32页:7.9神秘字符^H:解决方法-方法1
- 解决方法-方法1:按<Ctrl-Backsapce>-方法2:修改连接远程主机的程序的配置,控制<Backspace>键发送^?,而不是^H-方法3:改变远程主机的映射,将^H映射到erase信号上。如果要永久改变,在初始化文件中放入一条命令:stty erase ^H
第33页:7.10停止程序:intr
- 映射-大多数机器是^C映射到intr,还有一些是<Delete>映射到intr
第34页:停止程序:intr:intr信号的用处-
- intr信号的用处-1.停止一个僵死的程序。如果程序封闭了intr信号,则它应该提供退出的方式。-2.在shell中取消命令。输入命令后,如果不想执行,按^C,则删除命令内容
第35页:7.11另一种停止程序的方法:quit
第36页:7.11另一种停止程序的方法:quit
- quit和intr的区别-intr信号主要是由用户来使用-quit信号主要是由高级程序员使用,在终止测试程序时,发送quit信号。
第37页:另一种停止程序的方法:quit
- 为什么高级程序员使用quit?-系统收到^\时,不仅会停止程序运行,而且会将内存中的内容复制,写入到一个磁芯文件(core file)中,程序员可以利用工具查看磁芯文件,帮助调试程序。
第38页:另一种停止程序的方法:quit
- 内存技术的发展电子-机械式继电器磁芯存储器晶体管集成电路
第39页:7.12暂停显示:stop、start
- 映射-^S映射到stop信号^Q映射到start信号
第40页:暂停显示:stop、start
- 在什么情况下使用stop和start?-在屏幕上显示大量信息(超过一屏)时,信息快速闪过,可以按下^S停止显示,按下^Q继续显示。
第41页:7.13文件结束信号:eof
- 映射-^D映射到eof信号
- 在什么情况下使用eof信号?-使用键盘输入数据时,当输入完成时,可以按下^D,发送eof信号指示这一点。
第42页:7.14 shell和eof信号
- 在shell下使用eof信号-在shell中按下^D,会发送eof信号,告诉shell工作已完成。Shell会注销账户。
- 不想在shell中接受eof信号-封闭eof信号
第43页:7.15 Bash:封闭eof信号
- 使用环境变量IGNOREEOF-IGNOREEOF的值用来指定在注销之前,忽略多少次^D
第44页:Bash:封闭eof信号
- 例子$ echo $IGNOREEOF$ IGNOREEOF=5$ ^DUse “logout” to leave the shell$ IGNOREEOF=0$ ^D
第45页:Korn Shell:封闭eof信号
- 设置ignoreeof的shell选项-ignoreeof选项的状态只有两个:开和关,表示是否允许使用eof信号
第46页:Korn Shell:封闭eof信号
- 例子$ set–o (显示所有shell选项的值)$ set–o ignoreoef (封闭eof信号)$ ^DUse “exit” to leave shell$ set +o ignoreoef (开放eof信号)$ ^D
第47页:7.17 C-Shell:封闭eof信号
- 设置ignoreeof的shell变量-ignoreeof变量的状态有两个:定义和未定义
第48页:C-Shell:封闭eof信号
- 例子% set ignoreoef (封闭eof信号)% ^DUse “logout” to logout% unset ignoreoef (开放eof信号)% echo $ignoreoefignoreoef: Undefined variable% ^D
第49页:7.18显示键映射
- 重要键盘信号<Backspace>/<Delete>erase^Wwerase^X/ ^Ukill^Cintr^\quit^Sstop^Qstart^Deof
第50页:7.18显示键映射:显示系统键映射的命令
- 显示系统键映射的命令-stty–a在Linux的中输入stty–a:intr = ^C; quit = ^\; erase = ^?; kill = ^U;eof = ^D; …
第51页:7.19修改键映射
- 修改系统键映射的命令-sttysignal keys-例子:$ stty kill ^U$ stty kill K
第52页:7.20命令行编辑
- CLI中的编辑方式-1.可以使用<Left>和<Right>在命令行中移动光标位置;-2.可以使用<Backspace>删除前一个字符;-3. shell会将已输入的命令保存在“历史列表”中,可以使用<Up>和<Down>先前或先后翻看“历史列表”中记录。
第53页:7.21返回和换行
- Teletype ASR33的返回和换行-ASR33在打印时,打印头从左到右移动,移动到一行末尾时,首先:打印纸向上移动一行;其次:打印头返回到最左边。-控制打印头返回的信号是CR(返回信号)控制打印纸向上移动的信号是LF(换行信号)
第54页:7.21返回和换行:键映射-CR
- 键映射-CR
- <Return>/^MLF:^J
第55页:7.22新行字符的重要性
- 使用^M和^J的三种场景-1.文本文件分行时,使用^J标记每行的结束,这时的^J被称为“新行字符”。程序从文本文件中读数据的时候,遇到新行字符,就知道已读完一行。
第56页:7.22新行字符的重要性:使用^M
- 使用^M和^J的三种场景-2.在终端上键入字符时,在行的末尾按下<Return>键,发送^M字符。
第57页:7.22新行字符的重要性:使用^M
- 使用^M和^J的三种场景-3.数据显示时,每次向终端发送一行字符。在每行的末尾,光标必须有两个动作:光标返回到行的开头、光标移动到下一行。因此,在显示数据时,每行数据必须以^M^J结尾。
第58页:7.22新行字符的重要性示意图
本页为课件示意图,配合图形说明7.22新行字符的重要性小节的结构与流程。
第59页:新行字符的重要性:如何解决各个应用场景
第60页:7.22新行字符的重要性示意图
本页为课件示意图,配合图形说明7.22新行字符的重要性小节的结构与流程。
第61页:新行字符的重要性:Windows中文本
- Windows中文本文件的按行存储……^M^J……^M^J……^M^J
第62页:7.23 ^J的一个重要用途
- 终端的设置被破坏时,可以使用两条命令进行恢复-stty sane$ <Ctrl-J>stty sane<Ctrl-J>-reset$ <Ctrl-J>reset<Ctrl-J>
第63页:^J的一个重要用途:键不