一、桌面環(huán)境
1.1 Linux 桌面環(huán)境介紹
相對于現(xiàn)在的 Windows 系統(tǒng),UNIX/Linux 本身是沒有圖形界面的,我們通常在 UNIX/Linux 發(fā)行版上看到的圖形界面實際都只是運(yùn)行在 Linux 系統(tǒng)之上的一套軟件,類似 Windows95 之前的 Windows 的圖形界面實則也只是運(yùn)行在 DOS 環(huán)境的一套軟件。而 Linux 上的這套軟件以前是 XFree86,現(xiàn)在則是 xorg(X.Org),而這套軟件又是通過 X 窗口系統(tǒng)(X Window System,也常被稱為 X11 或 X)實現(xiàn)的,X 本身只是工具包及架構(gòu)協(xié)議,而 xorg 便是 X 架構(gòu)規(guī)范的一個實現(xiàn)體,也就是說它是實現(xiàn)了 X 協(xié)議規(guī)范的一個提供圖形界面服務(wù)的服務(wù)器,就像實現(xiàn)了 http 協(xié)議提供 web 服務(wù)的 Apache 。如果只有服務(wù)器也是不能實現(xiàn)一個完整的桌面環(huán)境的,當(dāng)然還需要一個客戶端,我們稱為 X Client,像如下幾個大家熟知也最流行的實現(xiàn)了客戶端功能的桌面環(huán)境 KDE,GNOME,XFCE,LXDE 。其中就有你看到的,實驗樓目前使用的 XFCE 桌面環(huán)境,部分老用戶可能可以回想起,實驗樓之前使用的環(huán)境是 LXDE 。這也意味著在 Linux 上你可以自己選擇安裝不同的桌面環(huán)境,甚至可以定制自己的專屬桌面。
這里講這么多,主要是為了幫助你更好地理解 Linux 的桌面環(huán)境是一個怎樣的概念,以及它跟 Windows 操作系統(tǒng)桌面的差異,實際它們之間是有著本質(zhì)的差別的,希望清楚這些內(nèi)容之后可以讓你忽略那些體驗上的差異,專心把精力放到 Linux 系統(tǒng)本身或者你正準(zhǔn)備學(xué)習(xí)的某一門技術(shù)之上,這門實驗課后面的內(nèi)容和實驗樓的其它課程便是為了幫助你實現(xiàn)以上兩個目標(biāo)。
1.2 Linux 桌面環(huán)境的使用
有興趣的用戶可以在自己的計算機(jī)中安裝完整的 Linux 發(fā)行版或其 Live CD 體驗。
二、linux終端
2.1 終端的概念
通常我們在使用 Linux 時,并不是直接與系統(tǒng)打交道,而是通過一個叫做 Shell 的中間程序來完成的,在圖形界面下為了實現(xiàn)讓我們在一個窗口中完成用戶輸入和顯示輸出,Linux 系統(tǒng)還提供了一個叫做終端模擬器的程序(Terminal),下面是幾個比較常見的終端模擬器: gnome-terminal,Konsole,xterm,rxvt,kvt,nxterm 和 eterm 。不過要注意的是這里所說的終端(Terminal)和控制臺(Console)是有區(qū)別的。

作者:2lppsctk
鏈接:https://www.zhihu.com/question/21711307/answer/56056972
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
在UNIX的術(shù)語中,最簡單的回答是:
終端(terminal)=tty=文本的輸入輸出環(huán)境
控制臺(console)=物理終端
shell=命令行解釋器
控制臺,終端和tty是密切相關(guān)的。原本它們都表示一臺可以和計算機(jī)交互的設(shè)備:在UNIX的早期階段,此類設(shè)備大多指電傳機(jī)器(像一臺打字機(jī)一樣),這種設(shè)備有時也叫做電傳打字機(jī),縮寫為TTY?!敖K端”(terminal)這個名字是從電子的觀點(diǎn)來看的,而“控制臺”是從設(shè)備的角度來看的。在UNIX歷史的極早期階段,電子鍵盤和顯示器就已經(jīng)是一種規(guī)范的終端。在UNIX術(shù)語中,tty是一種特殊的設(shè)備文件,它在read和write之外還實現(xiàn)了一些特殊的命令(ioctls)。
通常意義上terminal是tty的代名詞。有的tty由(軟件)內(nèi)核來代替硬件設(shè)備,比如從鍵盤發(fā)送過來的input,以及發(fā)送到文本模式的屏幕上的output,或者在串行線上傳輸?shù)膇nput/output流。
還有一種tty——有時候叫做偽tty(pseudo-ttys)的,它是由叫做”終端模擬器“的程序提供的(通過一個中間層),這種tty例如Xterm(運(yùn)行在X window系統(tǒng)上),Screen(在一個程序和另一個終端之間提供了中間層),SSH(在另一臺電腦上,通過程序連接另一臺點(diǎn)奧上的終端),Expect(用腳本和終端交互)之類。
"terminal"這個詞通常也有一個更加傳統(tǒng)的意思,表示一臺能夠用來和電腦交互的設(shè)備——通常有顯示器和鍵盤。比如一個X terminal(一種瘦客戶機(jī)——一種特殊用途的計算機(jī)),它唯一的作用就是驅(qū)動鍵盤,顯示器,鼠標(biāo),(偶爾還有)別的外圍交互設(shè)備;而實際上程序是泡在另外一臺更加強(qiáng)大的計算機(jī)上的。
Console通常的物理意義上是通過一些手段直接連到機(jī)器上的主終端(primary teminal),在一些操作系統(tǒng)(比如Linux和FreeBSD)上console一般有好幾個tty(用特定的組合鍵能夠在這些tty之間切換)。有時候這些命名讓人混亂,比如操作系統(tǒng)可能把那些tty叫做”console“ ”virtual console“ ”virtual terminal“之類的。
那么,既然說一個虛擬終端是”虛擬(virtual)”的,什么又是“真的”終端?
shell,作為用戶登錄系統(tǒng)時看到的主界面,它主要的用處就是啟動別的程序。(我不確定原來的比喻義是指shell是用戶的home環(huán)境,還是說shell是其他程序在里面跑的環(huán)境)在UNIX圈里,shell 特指命令行shell(并且圍繞這這樣的描述: “輸入你想要運(yùn)行的應(yīng)用的額名字,后面跟著文件或者其他的、應(yīng)用程序應(yīng)該據(jù)此作出調(diào)整的東西(翻譯:就是參數(shù)啦) ,并按回車鍵?!保?其他類型的環(huán)境并不使用“shell”這個詞,比如說窗口系統(tǒng)涉及了”窗口管理器“(window managers) 和”桌面環(huán)境“(desktop environments),但并不使用”shell“這個詞。UNIX shell有很多,比較流行的交互式shell包括bash(大多數(shù)Linux發(fā)行版的默認(rèn)選擇) zsh(重視功能和可定制性) 還有fish(以簡單為主旨)。命令行shell包括了用來組合命令的流程控制結(jié)構(gòu)。除了在交互式提示符下輸入命令外,用戶還可以編寫腳本。大多數(shù)shell都有一套共同的語法(基于Bourne shell)。當(dāng)我們討論”shell編程”時,shell幾乎都指Bourne風(fēng)格的shell。有的shell經(jīng)常用來運(yùn)行腳本,但缺少足夠的交互功能(比如說Korn shell——ksh,以及ash的許多變種)。 幾乎所有的UNIX-like操作系統(tǒng)都有一個Bourne風(fēng)格的shell(路徑一般是/bin/sh)——而且 不是ash ksh 就是bash。在UNIX系統(tǒng)管理中,一個用戶的shell是那個在登錄的時候被調(diào)用的程序。普通用戶賬戶也擁有命令行shell,受限的用戶(比如僅用于傳輸文件的賬戶)可能擁有一個受限的shell,或者只能運(yùn)行特定命令的shell。
終端和shell之間的分工并不是很明顯,下面是它們的主要工作:
輸入:終端把鍵盤操作轉(zhuǎn)換成控制序列(比如Left 轉(zhuǎn)換為 \e[D)。
shell再轉(zhuǎn)換控制序列成為命令(比如\e[D 轉(zhuǎn)換為后退字符)。在行編輯(line editon)中,輸入歷史和輸入補(bǔ)全功能是shell提供的。終端有時候會在它自己的行編輯功能中提供輸入歷史和輸入補(bǔ)全功能,并且在命令要執(zhí)行時通過line發(fā)送到shell中。唯一這樣做的主流terminal就是Emacs里的M-x。輸出:shell發(fā)出指令,比如說“display 某某” “切換前景色位綠色” “把光標(biāo)移動到下一行”之類。而終端就響應(yīng)這些指令。命令提示符是純粹的shell概念。shell永遠(yuǎn)開不到它所運(yùn)行的命令的輸出(除非重定向),輸出歷史(回滾)僅僅是個終端上的概念。應(yīng)用程序之間的復(fù)制粘貼是由終端提供的(通常用鼠標(biāo),或者組合鍵,比如Ctrl+SHift+V 或Shift+Insert)。 Shell可能有它自己的內(nèi)部復(fù)制粘貼機(jī)制(比如Meta+Y,Ctrl+Y)。作業(yè)控制(在后臺啟動程序,并且管理這些程序)主要是由shell執(zhí)行。不過,是由終端來處理組合鍵的(比如Ctrl+C 殺死前臺程序,或者Ctrl+Z終止任務(wù)運(yùn)行)。
終端本質(zhì)上是對應(yīng)著 Linux 上的/dev/tty 設(shè)備,Linux 的多用戶登陸就是通過不同的 /dev/tty 設(shè)備完成的,Linux 默認(rèn)提供了 6 個純命令行界面的 “terminal”(準(zhǔn)確的說這里應(yīng)該是 6 個 virtual consoles)來讓用戶登錄。在物理機(jī)系統(tǒng)上你可以通過使用[Ctrl]+[Alt]+[F1]~[F6]進(jìn)行切換。當(dāng)你切換到其中一個終端后想要切換回圖形界面,你可以按下[Ctrl]+[Alt]+[F7]來完成。
2.2 Shell
通常在圖形界面中對實際體驗帶來差異的不是上述的不同發(fā)行版的各種終端模擬器,而是這個 Shell(殼)。有殼就有核,這里的核就是指 UNIX/Linux 內(nèi)核,Shell 是指“提供給使用者使用界面”的軟件(命令解析器),類似于 DOS 下的 command(命令行)和后來的 cmd.exe 。
普通意義上的 Shell 就是可以接受用戶輸入命令的程序。它之所以被稱作 Shell 是因為它隱藏了操作系統(tǒng)底層的細(xì)節(jié)。同樣的 UNIX/Linux 下的圖形用戶界面 GNOME 和 KDE,有時也被叫做“虛擬 shell”或“圖形 shell”。
UNIX/Linux 操作系統(tǒng)下的 Shell 既是用戶交互的界面,也是控制系統(tǒng)的腳本語言。當(dāng)然這一點(diǎn)也有別于 Windows 下的命令行,雖然該命令行也提供了很簡單的控制語句。在 Windows 操作系統(tǒng)下,有些用戶從來都不會直接使用 Shell,然而在 UNIX 系列操作系統(tǒng)下,Shell 仍然是控制系統(tǒng)啟動、X11 啟動和很多其它實用工具的腳本解釋程序。
在 UNIX/Linux 中比較流行的常見的 Shell 有 bash、zsh、ksh、csh 等等,Ubuntu 終端默認(rèn)使用的是 bash,默認(rèn)的桌面環(huán)境是 GNOME 或者 Unity(基于 GNOME)。
2.3命令行操作體驗
2.3.1 寫在前面
在linux中,最最重要的就是命令,這就包含了2個過程,輸入和輸出
輸入
輸入當(dāng)然就是打開終端,然后按鍵盤輸入,然后按回車,輸入格式一般就是這類的
#創(chuàng)建一個名為 file 的文件,touch是一個命令
touch file
#進(jìn)入一個目錄,cd是一個命令
cd /etc/
#查看當(dāng)前所在目錄
pwd
輸出
輸出會返回你想要的結(jié)果,比如你要看什么文件,就會返回文件的內(nèi)容。如果只是執(zhí)行,執(zhí)行失敗會告訴你哪里錯了,如果施行成功那么會沒有輸出,因為linux的哲學(xué)就是:沒有結(jié)果就是最好的結(jié)果
開始
雙擊桌面上的 Xfce 終端 圖標(biāo)打開終端后系統(tǒng)會自動運(yùn)行 Shell 程序,然后我們就可以輸入命令讓系統(tǒng)來執(zhí)行了:
1) 重要快捷鍵:
真正學(xué)習(xí)命令行之前,你先要掌握幾個十分有用、必需掌握的小技巧:
[Tab]
使用Tab鍵來進(jìn)行命令補(bǔ)全,Tab鍵一般是在字母Q旁邊,這個技巧給你帶來的最大的好處就是當(dāng)你忘記某個命令的全稱時可以只輸入它的開頭的一部分,然后按下Tab鍵就可以得到提示或者幫助完成,當(dāng)然不止補(bǔ)全命令,補(bǔ)全目錄、補(bǔ)全命令參數(shù)都是沒問題的
[Ctrl+c]
想想你有沒有遇到過這種情況,當(dāng)你在 Linux 命令行中無意輸入了一個不知道的命令,或者錯誤地使用了一個命令,導(dǎo)致在終端里出現(xiàn)了你無法預(yù)料的情況,比如,屏幕上只有光標(biāo)在閃爍卻無法繼續(xù)輸入命令,或者不停地輸出一大堆你不想要的結(jié)果。你想要立即停止并恢復(fù)到你可控的狀態(tài),那該怎么辦呢?這時候你就可以使用Ctrl+c鍵來強(qiáng)行終止當(dāng)前程序(你可以放心它并不會使終端退出)。
嘗試輸入以下命令:
$ tail
然后你會發(fā)現(xiàn)你接下來的輸入都沒有任何反應(yīng)了,只是將你輸入的東西顯示出來,現(xiàn)在你可以使用Ctrl+c,來中斷這個你目前可能還不知道是什么的程序(在后續(xù)課程中我們會具體解釋這個tail命令是什么)。
又或者輸入:
$ find /
顯然這不是你想的結(jié)果,可以使用Ctrl+c結(jié)束。

雖然這個按著很方便,但不要隨便按,因為有時候,當(dāng)你看到終端沒有任何反應(yīng)或提示,也不能接受你的輸入時,可能只是運(yùn)行的程序需要你耐心等一下,就不要急著按Ctrl+c了。
其他一些常用快捷鍵
按鍵 作用
- Ctrl+d 鍵盤輸入結(jié)束或退出終端
- Ctrl+s 暫停當(dāng)前程序,暫停后按下任意鍵恢復(fù)運(yùn)行
- Ctrl+z 將當(dāng)前程序放到后臺運(yùn)行,恢復(fù)到前臺為命令fg
- Ctrl+a 將光標(biāo)移至輸入行頭,相當(dāng)于Home鍵
- Ctrl+e 將光標(biāo)移至輸入行末,相當(dāng)于End鍵
- Ctrl+k 刪除從光標(biāo)所在位置到行末
- Alt+Backspace 向前刪除一個單詞
- Shift+PgUp 將終端顯示向上滾動
9.S hift+PgDn 將終端顯示向下滾動
2) 學(xué)會利用歷史輸入命令
很簡單,你可以使用鍵盤上的方向上鍵↑,恢復(fù)你之前輸入過的命令,你一試便知。
3) 學(xué)會使用通配符
通配符是一種特殊語句,主要有星號(*)和問號(?),用來對字符串進(jìn)行模糊匹配(比如文件名、參數(shù)名)。當(dāng)查找文件夾時,可以使用它來代替一個或多個真正字符;當(dāng)不知道真正字符或者懶得輸入完整名字時,常常使用通配符代替一個或多個真正字符。
終端里面輸入的通配符是由 Shell 處理的,不是由所涉及的命令語句處理的,它只會出現(xiàn)在命令的“參數(shù)值”里(它不能出現(xiàn)在命令名稱里, 命令不記得,那就用Tab補(bǔ)全)。當(dāng) Shell 在“參數(shù)值”中遇到了通配符時,Shell 會將其當(dāng)作路徑或文件名在磁盤上搜尋可能的匹配:若符合要求的匹配存在,則進(jìn)行代換(路徑擴(kuò)展);否則就將該通配符作為一個普通字符傳遞給“命令”,然后再由命令進(jìn)行處理??傊ㄅ浞麑嶋H上就是一種 Shell 實現(xiàn)的路徑擴(kuò)展功能。在通配符被處理后, Shell 會先完成該命令的重組,然后繼續(xù)處理重組后的命令,直至執(zhí)行該命令。
先使用 touch 命令創(chuàng)建 2 個文件,后綴都為 txt:
$ touch adsfasd.txt wergjlkas.txt
可以給文件隨意命名,假如過了很長時間,你已經(jīng)忘了這兩個文件的文件名,現(xiàn)在你想在一大堆文件中找到這兩個文件,就可以使用通配符:
$ ls *.txt
在創(chuàng)建文件的時候,如果需要一次性創(chuàng)建多個文件,比如:“l(fā)ove_1_linux.txt,love_2_linux.txt,... love_10_linux.txt”。在 Linux 中十分方便:
$ touch love_{1..10}_linux.txt
輕松一下
apt-get install banner

Shell 常用通配符:
字符 含義
- *匹配 0 或多個字符
- ? 匹配任意一個字符
- [list] 匹配 list 中的任意單一字符
- [!list] 匹配 除list 中的任意單一字符以外的字符
- [c1-c2] 匹配 c1-c2 中的任意單一字符 如:[0-9] [a-z]
- {string1,string2,...} 匹配 string1 或 string2 (或更多)其一字符串
- {c1..c2} 匹配 c1-c2 中全部字符 如{1..10}
4) 學(xué)會在命令行中獲取幫助
在 Linux 環(huán)境中,如果你遇到困難,可以使用man命令,它是Manual pages的縮寫。
Manual pages 是 UNIX 或類 UNIX 操作系統(tǒng)中在線軟件文檔的一種普遍的形式, 內(nèi)容包括計算機(jī)程序(包括庫和系統(tǒng)調(diào)用)、正式的標(biāo)準(zhǔn)和慣例,甚至是抽象的概念。用戶可以通過執(zhí)行man命令調(diào)用手冊頁。
你可以使用如下方式來獲得某個命令的說明和使用方式的詳細(xì)介紹:
$ man <command_name>
比如你想查看 man 命令本身的使用方式,你可以輸入:
man man
通常情況下,man 手冊里面的內(nèi)容都是英文的,這就要求你有一定的英文基礎(chǔ)。man 手冊的內(nèi)容很多,涉及了 Linux 使用過程中的方方面面。為了便于查找,man 手冊被進(jìn)行了分冊(分區(qū)段)處理,在 Research UNIX、BSD、OS X 和 Linux 中,手冊通常被分為8個區(qū)段,安排如下:
區(qū)段 說明
1 一般命令
2 系統(tǒng)調(diào)用
3 庫函數(shù),涵蓋了C標(biāo)準(zhǔn)函數(shù)庫
4 特殊文件(通常是/dev中的設(shè)備)和驅(qū)動程序
5 文件格式和約定
6 游戲和屏保
7 雜項
8 系統(tǒng)管理命令和守護(hù)進(jìn)程
要查看相應(yīng)區(qū)段的內(nèi)容,就在 man 后面加上相應(yīng)區(qū)段的數(shù)字即可,如:
$ man 1 ls
會顯示第一區(qū)段中的ls命令 man 頁面。
所有的手冊頁遵循一個常見的布局,為了通過簡單的 ASCII 文本展示而被優(yōu)化,而這種情況下可能沒有任何形式的高亮或字體控制。一般包括以下部分內(nèi)容:
NAME(名稱)
該命令或函數(shù)的名稱,接著是一行簡介。
SYNOPSIS(概要)
對于命令,正