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.www58058.com/57949

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

相關推薦

  • 腳本編程部分_第十周練習

    Q1:寫一個腳本: (1) 能接受四個參數:start, stop, restart, status;start: 輸出“starting 腳本名 finished.”其余參數類似; (2) 其它任意參數,均報錯退出; #!/bin/bash # read -p "The following choices&…

    Linux干貨 2017-01-01
  • Linux第二周學習博客作業

    對第二周學習的內容進行總結

    Linux干貨 2017-12-10
  • Liunx 磁盤管理

    我們先來了解一下在Linux中磁盤的命名方式 命名:/dev/DEV_FILE    Sd :表示SCSI硬盤    Sda:表示SCSI硬盤中第一塊硬盤,b表示第二塊,以此類推 在Linux上次磁盤主要有兩種分區方式MBR和GPT MBR分區格式最多有4個分區,可以是4個主分區,或者3個主分區和1個擴展分區,第一個邏…

    2017-08-21
  • httpd功能配置之虛擬主機

       apache默認使用80端口提供服務,使用主服務器配置的話,一臺物理機只能提供一個站點服務;可以使用虛擬主機方式提供不同的訪問,以實現一臺主機提供多站點服務。    虛擬主機的實現方式有三種:基于端口、基于IP、基于主機名。    一、基于端口的虛擬主機     &nbsp…

    Linux干貨 2016-03-12
  • 磁盤管理

    上圖sda disk information中對 255 heads,63 sectors/track,1958 cylinders的解析: sda磁盤總共有1958個cylinder(柱面),每個cylinder(柱面)有63個sectors(扇區),每個sectors(扇區)有255個heads(磁頭) 那么這塊sda的總的磁頭數量為:255*63*19…

    2017-08-20
  • N25-第九周

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash #統計shell及非shell個數 #author:dodo declare -i loginnum=0 declare -i nologinnum=0 while…

    Linux干貨 2017-05-27

評論列表(1條)

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

    總結的比較全面,贊~~繼續加油~堅持哈~

欧美性久久久久