2. 初识shell

    在Linux早期, 可以用来工作的只有shell. 那时, 系统管理员, 程序员和系统用户都坐在Linux命令行终端前, 输入文本命令, 查看文本输出. 而现在, 因为有了绚丽的图形化桌面环境, 在系统上找到shell提示符都变得困难起来. 接下来将会讨论提供命令行环境需要什么, 然后带你逐步了解可能会在各种Linux发行版中碰到的终端模拟软件包.


   2.1    终端模拟

    在图形化桌面出现之前, 和Unix系统交互的唯一方式就是通过shell提供的文本命令行界面(CLI, Command Line Interface). CLI只允许输入文本, 而且只能显示文本和低级图形输入.

    由于这个限制, 输出设备不必非常好, 通常一个简单的哑终端(伪终端)就是和Unix系统交互所需要的所有设备了.     哑终端(dumb terminal)通常是由通信电缆(通常是多线串行电缆, 也叫带状电缆) 连接到Unix系统上的显示器和键盘 (尽管后来鼠标的出现多多少少改善了这种状况).    这个简单的组合提供了向Unix系统输入文本数据和显示文本结果的一条捷径.

    如你所熟知的, 今天的Linux环境已经完全不同了.    几乎所有Linux发行版都采用了某种类型的图形化桌面环境.     但要访问shell, 你仍然需要一个文本显示来和CLI交互.    于是现在的问题归结为一点: 有了所有图形化桌面的新功能, 有时在Linux发行版上找个进入CLI的途径还真不是件容易的事.

    进入CLI的一个途径是让Linux系统退出图形化桌面模式, 进入本文模式.    这样在显示器上只能提供一个简单的shell CLI ,  就跟图形化桌面出现以前一样. 这种模式称作Linux控制台, 因为它模拟了早期的硬接线(hard-wired)控制台终端, 而且是跟Linux系统交互的直接接口.

    进入Linux控制台的另一种办法是使用图形化Linux桌面环境里的终端模拟包, 终端模拟包会模拟在哑终端上工作, 所有的都在桌面上的一个图形化窗口中.     图1-1显示了一个图形化Linux桌面环境上运行的终端模拟器的例子.

        1478422595896993.jpg

图2-1 CentOS 7    Linux桌面上运行的简单终端模拟器


    每个终端模拟包都可以模拟一种或多种特定类型的哑终端. 如果你要使用Linux中的shell,  很不幸你需要知道一点关于终端模拟的知识.

    了解过去哑终端的核心功能, 可以帮你在使用图形化终端模拟器时决定选用哪种模拟类型, 并将所有可用的功能最大限度地发挥起来.  哑终端中用到的主要功能可以分成两块: 图形功能和键盘. 下面将会介绍这些功能并讨论它们和不同类型的终端模拟器由多大的关系.


    2.1.1    图形功能

        终端模拟的最重要部分是它如何在显示器上显示信息.     当你听到短语 "文本模式" 时 , 可能你最不会想到的就是图形.  但即使是最低级的哑终端也支持某些屏幕操作方法 (例如清空屏幕和在屏幕上特定位置显示文本) .

    下面将会细述使每种不同的终端类型有别于其他类型的图形功能, 以及在终端模拟包中都有什么.

    1. 字符集

    所有的终端都必须在屏幕上显示字符 (否则, 文本模式就没有意义了) .  关键在于要显示什么样的字符以及Linux系统需要发送什么样的代码来显示它们.  字符集是一组二进制命令, LInux系统可以将它们发给显示器来显示字符.  各种终端模拟包支持以下几种字符集.

  •     ASCII  —    美国信息交换标准码 (American Standard Code for Information Interchange ) . 这个字符集含有用7位码存储的英文字符, 由128个英文字母(包括大小写),  数字和特殊字符号组成.这个字符集由美国国家标准协会(ANSI) 比准为 US-ASCII .  你会经常在终端模拟器中看到它被引用为ANSI字符集.

  •     ISO-8859-1 (通常称为 Latin-1 )  —  ASCII字符集的一个扩展, 由ISO (International Organization for Standardzation, 国际标准化组织) 制定.  它采用8位码来支持标准ASCII字符以及大多数西欧语言中的特殊外语字符.   Latin-1 字符集在多国终端模拟包中很流行.

  •     ISO-8859-2  —  ISO字符集, 支持东欧语言字符.

  •     ISO-8859-6  —  ISO字符集, 支持阿拉伯语字符.

  •     ISO-8859-7  —  ISO字符集, 支持希腊语字符.

  •     ISO-8859-8  —  ISO字符集, 支持希伯来语字符.

  •     ISO-10646 ( 通常称为Unicode )  —  ISO双字节字符集, 包换大部分英语和非英语语言的代码.  这个字符集包含所有 ISO-8869-x系列字符集中定义的所有字符. Unicode字符集在开源应用中流行.

    到目前为止, 英国国家中在用的最常见的字符集是Latin-1字符集.  Unicode字符集越来越流行,  很有可能有一天成为字符集中的新标准. 大部分流行的终端模拟器允许你在终端模拟中选择要用哪个字符集.

    2. 控制码

    除了能显示字符外, 终端还必须能控制显示器和键盘上的特殊功能, 比如屏幕上光标的位置.  终端用控制码系统来实现这个. 控制码是未在字符集中使用的特殊代码, 它会发信号给终端来执行特殊的非打印操作.

    控制码也可以用来控制哑终端的通信功能. 哑终端会通过某种类型的通信信道 ( 通常是串行通信电缆 ) 来连到计算机系统上. 有时需要在通信信道上控制数据, 所以开发人员就设计出只用于数据通信目的的特殊控制码. 虽然这些代码在现代终端模拟器上并不是必须的, 但大多数终端模拟器都支持这些代码以保持兼容性.  这类中最常用的代码是XON和XOFF代码, 它们分别开启和停止到终端的数据传输.

    3. 块模式图形

    由于哑终端逐渐地流行起来, 制造商开始试验基本的图形功能. 到目前为止, 最流行的"图形化" 哑终端类型是DEC ( Digital Equipment Corporation, 美国数字设备公司 )的VT系列终端. 1978年, 伴随着DEC VT100的发布哑终端发生了转变.  DEC VT100终端是第一个支持完整ANSI字符集( 包括块模式图形字符 )的终端.

    ANSI字符集包含的代码不但允许显示器显示文本, 而且允许显示基本的图形符号, 比如框, 线和块. 到目前为止, 20世纪80年代中Unix运行中使用的最流行的哑终端之一是VT100的升级版DEC VT102.  大多数现代终端模拟程序仍然会模拟VT102显示的运行, 支持所有的ANSI代码来创建块模式图形.

    4. 矢量图形

    Tektronix公司生产了一系列流行的终端, 它们采用了一种叫做矢量图形的显示方法. 矢量图形是基于DEC的块模式图形方法设计的, 它将所有的屏幕图像( 包括字符 )变成一系列的线段 ( 矢量 ). Tektronix4010终端是生产的最流行的图形化哑终端. 许多终端模拟包仍然会模拟它的功能.

    4010终端通过使用电子束绘制一系列的矢量来显示图像, 非常像用铅笔绘制. 由于矢量图形不用点来创建线, 它能用相比其他基于点的图形终端更高的精度来绘制几何形状. 这是一个在数学家和科学家中流行的功能.

    现代终端模拟器使用软件来模拟Tektronix4010终端的矢量图形绘制功能. 对于那些需要绘制高精度图形, 或仍在运行使用矢量图形函数来绘制复杂图表的应用的人来说, 这仍然是一个受欢迎的功能.

    5. 显示缓冲

    图形显示的一个关键要素是终端缓冲数据的能力. 缓冲数据需要终端内部有额外的内存来存储当前未在显示器上显示的字符.

    6. 色彩

    即使是黑白 ( 或绿 ) 世界的哑终端时代, 程序员也在试验用不同的方法来呈现数据. 大多数终端支持同时的控制码来生成特殊文本.

    在过去, 如果你想引起别人的注意, 你会用加粗, 闪烁和图像反转文本.  现在有些东西可能会刺激到你的眼睛了!

    在色彩终端到来时, 程序员们添加了特殊的控制码来显示各种颜色和形状的文本. ANSI字符集包括了一些控制码, 它们用来指定显示器上显示的前端文本和背景色的颜色.  大部分终端模拟器支持ANSI色彩控制码.

    

    2.1.2 键盘

        对终端来说除了显示器如何操作之外, 还有很多内容. 如果你曾经用过不同类型的哑终端, 你应该会发现键盘上通常含有与现在不同的键.  对于终端模拟包来说, 模拟特定哑终端上的特定键已经被证明不是件容易的事.

        pc键盘的的发明者不可能将哑终端上每种可能的特殊键类型都包含进来. 一些pc制造商曾尝试过包含一些带特定功能的特殊键, 但最终pc键盘的按键在某种程度上已被标准化了.


    2.2  terminfo 数据库

    既然你知道了终端模拟包可以模拟不同类型的终端, 你需要一个途径来让Linux系统知道你模拟的是具体哪个终端.  Linux系统需要知道在和终端模拟器通信时使用哪些控制码.  这是通过使用一个环境变量和一组共称为terminof数据库的特殊文件来实现的.

    terminfo数据库是一组文件,  这些文件标识了各种可以用在Linux系统上的终端的特性. Linux系统将每种终端类型的terminfo数据作为一个单独文件存储在terminfo数据库目录.  这个目录的位置经常随着发行版的不同而不同.  常见的位置有 /usr/share/terminfo,   /etc/terminfo和/lib/terminfo.

    为了便于组织 ( 通常由大量不同的terminfo文件 ), 你会看到terminfo数据库目录含有针对不同字母的目录. 特定终端的单独文件被存储在它们的终端名称对应的字幕目录下.  举个例子, 在 /usr/share/terminof/v里是VT100终端模拟器.

    terminfo文件是个二进制文件, 它是编译文本文件的结果. 这个文本文件含有定义了屏幕功能的代码字, 以及在终端上实现这个功能所需的控制码.

    由于terminfo数据库文件是二进制的, 你无法看到这些文件中的代码.  不过, 你可以用infocmp命令来将二进制条目转换成文本.

    使用这条命令的例子如下:

# infocmp vt100
# Reconstructed via infocmp from file: /usr/share/terminfo/v/vt100
        vt100|vt100-am|dec vt100 (w/advanced video),
        am, mc5i, msgr, xenl, xon,
        cols#80, it#8, lines#24, vt#3,
        acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
        clear=\E[H\E[J$<50>, cr=^M, csr=\E[%i%p1%d;%p2%dr,
        cub=\E[%p1%dD, cub1=^H, cud=\E[%p1%dB, cud1=^J,
        cuf=\E[%p1%dC, cuf1=\E[C$<2>,
        cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
        cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>, el1=\E[1K$<3>,
        enacs=\E(B\E)0, home=\E[H, ht=^I, hts=\EH, ind=^J, ka1=\EOq,
        ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOp, kc3=\EOn, kcub1=\EOD,
        kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy,
        kf1=\EOP, kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
        kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, lf1=pf1, lf2=pf2,
        lf3=pf3, lf4=pf4, mc0=\E[0i, mc4=\E[4i, mc5=\E[5i, rc=\E8,
        rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmam=\E[?7l,
        rmkx=\E[?1l\E>, rmso=\E[m$<2>, rmul=\E[m$<2>,
        rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
        sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;$<2>,
        sgr0=\E[m\017$<2>, smacs=^N, smam=\E[?7h, smkx=\E[?1h\E=,
        smso=\E[7m$<2>, smul=\E[4m$<2>, tbc=\E[3g,

    terminfo条目定义了终端名 ( 本例中是vt100 ), 以及可以跟终端名关联起来的所有别名. 注意第一行说明了提取这些值的terminfo文件的位置.

    Linux shell使用TERM环境变量来定义对特定会话使用terminfo数据库中的哪个终端模拟设置.   当TERM环境变量设为vt100时, shell就知道使用跟vt100 terminfo数据库条目关联的控制码来向终端模拟器发送控制码. 

    要查看TERM环境变量,  你可以CLI中显示它:

#echo $TERM
xterm
#

     这个例子说明当前终端类型设成了terminfo数据库中的xterm条目.


    2.3  Linux控制台

    在Linux的早期, 在启动系统时你只会在显示器上看到一个登陆提示符, 没别的了. 如前面提到的, 这就是Linux控制台.  它是你可以为系统输入命令的唯一地方.

    在现代Linux系统上, 当Linux系统启动时它会自动创建几个虚拟控制台. 虚拟控制台是运行在Linux系统内存中的一个终端会话. 你可以只用一个pc键盘和显示器来访问它们.

    在大多数Linux发行版中, 你可以使用简单的按键组合来访问这些虚拟控制台. 通常你必须按下Ctrl+Alt组合键, 然后按一个功能键( F1 – F8 )来进入你要使用的虚拟控制台. 功能键F1生成虚拟控制台1, F2键生成虚拟控制台2, 依次类推.

    虚拟控制台中的6个都使用全屏文本终端模拟器来显示文本登录界面, 如图2-2所示.

1478488878592536.jpg

       图 2-2 Linux控制台登录界面

    

    在用用户ID和密码登录后, 你会被带到Linux bash shell CLI .  在Linux控制台中, 你不能运行任何图形化程序.  你只能使用文本程序来在Linux文本控制台上进行显示.

    登录到虚拟控制台上后,  你可以让它保持活动并切换到另一个虚拟控制台上而不会丢失活动的会话.   你可以在所有的虚拟控制台之间切换, 运行多个活动会话.

    前两个或最后两个虚拟控制台通常为X Windows图形化桌面保留.  有的发行版只会分配一个, 所以你可能需要测试所有三个Ctrl+Alt+F1, Ctrl+Alt+F7和Ctrl+Alt+F8, 来看看你的发行版使用的是哪个. 大部分发行版会开机顺序完成后自动切换到一个图形化虚拟控制台, 提供了完整的图形化登录和桌面体验. 

    先登录到文本虚拟终端会话, 然后在切换到一个图形化的会话会比较麻烦. 幸运的是,  在Linux系统上有更好的办法来图形化模式和文本模式之间切换: 终端模拟包是从图形化桌面会话访问shell CLI的一个流行方法.  下面几节将会介绍在图形化窗口中提供终端模拟的最常用的软件包

  

    2.4  xterm终端

    最早的也是最基本的X Windows终端模拟包是xterm. xterm包自从有了X  Windows之时起就有了, 默认包含在大多数X Windows包中.

    xterm包提供了一个基本的VT102/220终端模拟CLI和一个图形化Tektrenix 4014环境 ( 类似于4010环境 ).  虽然xterm是一个完整的终端模拟包, 但它并不需要额外的资源( 比如内存 ) 来运行.  鉴于这点, 在设计在较早硬件平台上运行的Linux发行版中,  xterm包仍然流行.  一些图形化桌面环境, 比如fluxbox, 将它用作默认的终端模拟包.

    虽然并未提供太多好用的功能, 但xterm包把一件事做到了极致, 那就是模拟VT220终端. 新版本中的xterm甚至可以模拟支持色彩控制码的VT系列, 允许你在脚本中使用色彩.

    图2-3展示了运行在图形化Linux桌面上的基本xterm显示.

    

1478490828672859.jpg

图2-3  基本 xterm 显示

    xterm包允许你用命令行参数和4个简单的图形化菜单来设置每个功能.

  

    2.5  Konsole终端

    KDE桌面项目创建了它自己的终端模拟包, 称为Konsole.   Konsole包不仅集成了基本的xterm功能,  而且还有一些我们所期望的在Windows应用中才有的高级功能.

    2.6  GNOME Terminal

    GNOME桌面项目也有它自己的终端模拟程序.  GNOME Terminal软件包有许多跟Konsole和xterm相同的功能.

  

    2.7  总结

    要开始学习Linux命令行命令, 你需要先能访问命令行.

        





















原创文章,作者:vt.lee,如若转载,请注明出处:http://www.178linux.com/57949

(0)
vt.leevt.lee
上一篇 2016-11-06
下一篇 2016-11-06

相关推荐

  • awk的进阶

    前言 awk的中有很多的控制语句,awk也支持if语句,while语句,for语句等等编程逻辑充的控制语句及数组、函数。 awk的进阶无非就是多练。 1.控制语句 (1)if-else语句 语句格式: if(condition) {statments}    if  (条件) 条件为真 执行{statments} 只有一个语句可…

    Linux干货 2016-06-26
  • dd命令详解及实战应用

    dd简述 dd在linux中是 一个强大的命令,常用于拷贝大量数据,测试读写效能 ,清空硬盘数据(慎用),不仅如此,由于dd 允许以二进制方式读写,所以特别适合在原始设备上输入、输出。 dd与cp的区别 这里有必要说明一下,两个命令都可用于拷贝,但是级别却完全不一样:cp是文件级别的读取方式,而dd更底层,可以数据块级别去读取硬盘,由此可看出在效率…

    Linux干货 2017-04-04
  • heartbeat实现高可用集群(1)

    环境 node1 192.168.1.35 node2 192.168.1.36 fip 192.168.1.80 daemon httpd nfs 192.168.1.15 配置HA集群的前提 1.节点时间必须同步,使用ntp协议实现 2.节点间需要通过主机互相通信,必须解析主机名至IP地址 a.建议名称解析功能能使用hosts文件实现 b.通信中使用的名…

    Linux干货 2017-11-03
  • 文本字符处理工具

    文件查看命令 cat,tac,rev cat [options] [file]     -E:显示行结束符     -n:显示行号                    nl file 也能实现相同的功能   …

    Linux干货 2017-02-25
  • Shell脚本编程之入门基础(二)if、case的使用

    Shell编程之条件选择和条件判断   一、条件选择(if)与条件判断(case)的对比: if语句:是选择执行,if语句可嵌套。 if条件选择使用格式 单分支 双分支 多分支 if 判断条件;then 条件为真的分支代码 fi if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi if CONDITION1; the…

    Linux干货 2016-08-15
  • 命令(2017.5.16-2017.519-部分)

    命令(1) bc  计算器 dd if=/dev/zero 查看逻辑设备(非硬件) dd if=/dev/sd 查看硬件设备 dd if=/dev/zeroof=file bs=1M count=24  写入磁盘速度 dd if=/dev/zeroof=/dev/null bs=1M count=24  测试…

    Linux干货 2017-05-22

评论列表(1条)

  • 马哥教育
    马哥教育 2016-11-10 14:36

    总结的比较全面,赞~~继续加油~坚持哈~