- Linux基礎及應用教程(基于CentOS7)
- 梁如軍 王宇昕 車亞軍等編著
- 9676字
- 2019-08-02 16:57:53
第2章 Linux操作基礎
本章首先介紹Shell的相關概念、命令格式、通配符的使用方法,然后分別介紹了各類Linux常用命令的使用以及文本編輯器Vi的使用,最后介紹了Shell的重定向、管道、命令替換等功能以及Shell變量的定義與Shell環境的配置等。
2.1 Shell和命令基礎
2.1.1 Shell簡介
1.什么是Shell
Shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口(命令解釋器),Shell接收用戶輸入的命令并把它送入內核執行,在用戶與系統之間進行交互。Shell在Linux系統中具有極其重要的地位,如圖2-1所示。
圖2-1 Shell在Linux系統中的地位
2.Shell的功能
命令解釋器是Shell最重要的功能。Linux系統中的所有可執行文件都可以作為Shell命令來執行。將Linux的可執行文件進行分類,如表2-1所示。
表2-1 Linux系統上可執行文件的分類
圖2-2描述了Shell是如何完成命令解釋的。
圖2-2 命令解釋過程
當用戶提交了一個命令后,Shell首先判斷是否為內置命令(由Shell自身負責解釋),如果是就通過Shell的解釋器將其解釋為系統功能調用并轉交給內核執行;若是外部命令或實用程序,就試圖在硬盤中查找該命令并將其調入內存,再將其解釋為系統功能調用并轉交給內核執行。在查找該命令時分為兩種情況:
(1)用戶給出了命令的路徑,Shell就沿著用戶給出的路徑進行查找,若找到則調入內存,若沒找到則輸出提示信息。
(2)用戶沒有給出命令的路徑,Shell就在環境變量PATH所制定的路徑中依次進行查找,若找到則調入內存,若沒找到則輸出提示信息。
此外,Shell還具有如下功能。
●通配符、命令補全、別名機制、命令歷史。
●重定向、管道、命令替換、Shell編程等。
3.Shell的主要版本
表2-2中列出了幾種常見的Shell版本。RHEL/CentOS下默認的Shell是bash。
表2-2 Shell的不同版本
4.Shell的元字符
在Shell中有一些具有特殊的意義字符,稱為Shell元字符(Shell Metacharacters)。若不以特殊方式指明,Shell并不會把它們當作普通文字符使用。
表2-3中簡單介紹了常用的Shell元字符的含義。
表2-3 常用的Shell元字符及含義
2.1.2 命令格式和通配符
1.命令格式
Shell命令的一般格式為
其中,cmd是命令名;options是選項;arguments是參數,即操作對象。
說明:
●最簡單的Shell命令只有命令名,復雜的Shell命令可以有多個選項和參數。
●選項和參數都作為Shell命令執行時的輸入,它們之間用空格分隔開。
●單字符參數前使用一個減號(-),單詞參數前使用兩個減號(--)。
●多個單字符參數前可以只使用一個減號。
●操作對象(arguments)可以是文件也可以是目錄,有些命令必須使用多個操作對象如cp命令必須指定源操作對象和目標操作對象。
●并非所有命令的格式都遵從以上規則,如dd、find等。
例如:
具有以上格式的字符串習慣地稱為命令行,命令行是用戶與Shell間對話的基本單位。
2.目錄和文件名的命名規則
在Linux下可以使用長文件或目錄名,可以給目錄和文件取任何名字,但必須遵循下列規則:
●除了/之外,所有的字符都合法。
●有些字符最好不用,如空格符、制表符、退格符和字符:?,@ # $ & () \ | ;‘ ’“ ”<>等。
●避免使用+、–或.來作為普通文件名的第一個字符。
●大小寫敏感。
●以.開頭的文件或目錄是隱含的。
3.通配符
通配符主要用于用戶方便描述目錄或文件。表2-4中是常用的通配符及其說明。
表2-4 常用的通配符
提示
*能匹配文件或目錄名中的.,但不能匹配首字符是.的文件或目錄名。要匹配隱含文件應該使用.*。
通配符在指定一系列的文件名時非常有用,表2-5中列舉了一些使用通配符的例子。
表2-5 通配符使用舉例
2.1.3 文件及Linux目錄結構
1.什么是文件
在Linux系統上,文件被看作是字節序列。這種概念使得所有的系統資源有了統一的標識,這些資源包括普通文件或目錄、磁盤設備、控制臺(鍵盤、顯示器)、打印機等。對這些資源的訪問和處理都是通過字節序列的方式實現的。Linux系統下的文件類型包括:
●普通文件(-)。
●目錄(d)。
●符號鏈接(l)。
●字符設備文件(c)。
●塊設備文件(b)。
●套接字(s)。
●命名管道(p)。
2.普通文件
普通文件就是字節序列,Linux并沒有對其內容規定任何的結構。普通文件可以是程序源代碼(C、C++、Python、Perl等)、可執行文件(文件編輯器、數據庫系統、出版工具、繪圖工具等)、圖片、聲音、圖像等。Linux不會區別對待這些文件,只有處理這些文件的應用程序才會根據文件的內容為它們賦予相應的含義。
在DOS或Winodws環境中,所有的文件名后綴就能表示該文件的類型,如*.exe表示可執行文件,*.bat表示批處理文件。在Linux環境下,只要是可執行的文件并具有可執行屬性則就能執行,不管其文件名后綴是什么。但是對一些數據文件一般也遵循一些文件名后綴規則,表2-6中列出了一些常用的文件后綴。
表2-6 常用的文件后綴舉例
3.目錄和硬鏈接
目錄文件是由一組目錄項組成,目錄項可以是對其他文件的指向也可以是其下的子目錄指向。
實際上,一個文件的名稱是存儲在其父目錄中的,而并非同文件內容本身存儲在一起。
將兩個文件名(存儲在其父目錄的目錄項中)指向硬盤上一個存儲空間,對兩個文件中的任何一個的內容進行修改都會影響到另一個文件,這種鏈接關系稱為硬鏈接。硬鏈接文件實際上就是在某目錄中創建目錄項,從而使不止一個目錄可以引用到同一個文件。它可以由ln命令建立。首先查看一下目錄中的文件情況。
使用ln命令建立文件file1的硬鏈接文件file2。
該命令產生一個新的文件file2,和已經存在的文件file1建立起硬鏈接關系:
可以看出,file2和file1的大小相同,內容相同。再看詳細信息的第2列,原來file1的鏈接數是1,說明這一塊硬盤存儲空間只有file1一個文件指向它,而建立起file1和file2的硬鏈接關系之后,這塊硬盤空間就有file1和file2兩個文件同時指向它,所以file1和file2的鏈接數就都變為了2。因為兩個文件指向一塊硬盤空間,所以如果現在修改file2的內容為This is file2.,再查看file1的內容,就會有:
如果刪除其中的一個文件(不管是哪一個),就是刪除了該文件和硬盤空間的指向關系,該硬盤空間不會釋放,另外一個文件的內容也不會發生改變,但是目錄詳細信息中的鏈接數會減少,見如下信息。
硬鏈接并不是一種特殊類型的文件,只是在同一個文件系統中允許多個目錄項指向同一個文件的一種機制。
4.符號鏈接
符號鏈接又稱軟鏈接,是指將一個文件指向另外一個文件的文件名。這種符號鏈接的關系由ln-s命令行建立。首先查看一下目錄中的文件信息。
使用ln命令和-s選項建立文件file1的符號鏈接文件file2
該命令產生一個新的文件file2,和已經存在的文件file1建立起符號鏈接關系
可以看出file2這個文件很小,因為它只是記錄了要指向的文件名而已,請注意從文件file2指向文件file1的指針。
為什么cat命令顯示的file2的內容與file1相同呢?因為cat命令在尋找file2的內容時,發現file2是一個符號鏈接文件,根據file2記錄的文件名找到了file1文件,然后將file1的內容顯示出來。
明白了file1和file2的符號鏈接關系,就可以理解為什么file1的鏈接數仍然為1,這是因為file1指向的硬盤空間仍然只有file1一個文件在指向。
如果現在刪除了file2,對file1并不產生任何影響;而如果刪除了file1,那么file2就因無法找到文件名稱為file1的文件而成為死鏈接。
5.設備文件
設備是指計算機中的外圍硬件裝置,即除了CPU和內存以外的所有設備。通常,設備中含有數據寄存器或數據緩存器、設備控制器,用于完成設備同CPU或內存的數據交換。
在Linux下,為了屏蔽用戶對設備訪問的復雜性,采用了設備文件,即可以通過像訪問普通文件一樣的方式對設備進行讀寫訪問。
設備文件用來訪問硬件設備,包括硬盤、光驅、打印機等。每個硬件設備至少與一個設備文件相關聯。設備文件分為字符設備(如鍵盤)和塊設備(如磁盤)。Linux下設備名以文件系統中的設備文件的形式存在。所有的設備文件存放在/dev目錄下。
下面對常用設備列表說明,如表2-7所示。
表2-7 常用設備文件說明
在/dev目錄下有許多鏈接文件,使用這些鏈接能夠方便地使用系統中的設備。例如,可以通過/dev/cdrom而不是/dev/sr0來訪問光驅。
6.套接字和命名管道
套接字和命名管道是Linux環境下實現進程間通信(IPC)的機制。
命名管道(FIFO)文件允許運行在同一臺計算機上的兩個進程之間進行通信。套接字socket)允許運行在不同計算機上的進程之間相互通信。
套接字和命名管道通常是在進程運行時創建或刪除的,一般無需系統管理員干預。
7.熟悉Linux的目錄結構
Linux的目錄結構遵從文件系統層次結構標準(File system Hierarchy Standard,FHS)。表2-8中解釋了由FHS所規定的存放特定類型的文件位置。
表2-8 由FHS所規定的Linux文件系統布局
提示
1.在Linux環境下,文件是歸類存放的。初學Linux的朋友應該熟悉特定類型的文件的存放位置。
2.對于Linux的初學者而言,在不知道自己究竟在做什么的情況下,不要輕易操作系統目錄,如/proc、/boot、/etc、/usr、/var等。
3.用戶可以使用如下命令獲得Linux文件層次結構的說明:
$ man hier
2.2 Linux常用操作命令
2.2.1 文件目錄操作命令
1.常用的文件目錄操作命令
表2-9中列出了一些常用的文件目錄操作命令。
表2-9 常用的文件目錄操作命令
2.文件目錄命令操作舉例
表2-10中列出了一些常用的文件目錄操作命令的使用舉例
表2-10 常用的文件目錄操作命令使用舉例
提示
GNU/Linux的文件有如下3種類型的時間戳。
●mtime:最后修改時間(Is-lt)。
●ctime:狀態改變時間(Is-lc)。
●atime:最后訪問時間(Is-lu)。
說明:
(1)ctime并非文件創建時間。
(2)覆蓋一個文件會改變所有3類時間:mtime、ctlme和atime。
(3)改變文件的訪問權限或擁有者會改變文件的ctime和atime。
(4)讀文件會改變文件的atlme。
2.2.2 文本文件操作命令
1.常用的文本文件操作命令
表2-11中列出了一些常用的文本文件操作命令。
表2-11 常用的文本文件操作命令
2.正則表達式
在許多文本處理工具(如grep、sed、awk、vi等)中都可以使用正則表達式。正則表達式是使用某種模式(pattern)來匹配(matching)一類字符串的一個公式。通常使用正則表達式進行查找、替換等操作。雖然復雜的正則表達式對于初學者來說晦澀難懂,但對于Linux使用者來說,學會使用正則表達式是非常必要的。在適當的情況下使用正則表達式可以極大地提高工作效率。POSIX風格的正則表達式有兩種:基本的正則表達式(Basic Regular Expression,BRE)和擴展的正則表達式(Extended Regular Expression,ERE)。
正則表達式由一些普通字符和一些元字符(metacharacters)組成。普通字符包括大小寫的字母、數字(即所有非元字符),而元字符則具有特殊的含義。表2-12和表2-13中列出了POSIX RE的元字符及其含義。
表2-12 POSIX RE用于方括號之外的元字符
表2-13 POSIX RE用于方括號之內的元字符
3.常用的文本文件操作命令舉例
表2-14中列出了一些常用的文件目錄操作命令的使用舉例
表2-14 常用的文件目錄操作命令使用舉例
(續)
注意
上述例子中的sed命令僅將處理結果顯示在屏幕上而未修改源文件的內容。若希望修改源文件的內容,可在sed命令后使用-i參數。
2.2.3 打包和壓縮命令
1.常用的打包(歸檔)和壓縮命令
用戶經常需要把一組文件存儲成一個文件以便備份或傳輸到另一個目錄甚至另一臺計算機。有時還需要把文件壓縮成一個文件,使得其占用少量的磁盤空間并能更快地通過互聯網傳輸。表2-15中列出了一些常用的打包和壓縮命令。
表2-15 與打包和壓縮相關的常用命令
提示
正確使用zcat/zmore/zless/zgrep、bzcat/bzmore/bzless/bzgrep、xzcatjxzmore/ xzless/xzgrep命令的前提是壓縮前的文件是純文本文件。
2.常用的打包和壓縮命令操作舉例
表2-16中列出了一些常用的壓縮命令操作舉例。
表2-16 常用的壓縮命令操作舉例
(續)
在Linux環境下,通常使用GNU的tar命令調用各個壓縮軟件實現打包壓縮和解壓縮。表2-17中列出了tar命令和壓縮命令的操作舉例。
表2-17 tar打包與壓縮命令操作舉例
2.2.4 信息顯示命令
1.常用的信息顯示命令
表2-18中列出了一些常用的信息顯示命令。
表2-18 常用的信息顯示命令
(續)
2.常用的信息顯示命令操作舉例
表2-19中列出了一些常用的信息顯示命令的操作舉例。大多數的信息顯示命令無須使用任何參數,表2-19中僅舉例說明需要帶參數的命令。
表2-19 常用的信息顯示命令操作舉例
2.2.5 文本編輯器Ⅵ
1.Ⅵ的簡介
Ⅵ是Visual interface的簡稱,可以執行輸出、刪除、查找、替換、塊操作等眾多文本操作,而且用戶可以根據自己的需要對其進行定制,這是其他編輯程序所沒有的功能。
Vi不是一個排版程序,不像MS Word或WPS那樣可以對字體、格式、段落等其他屬性進行編排,它只是一個文本編輯程序。
2.進入Ⅵ
表2-20中列出了進入Vi文本編輯器的方式及說明。
表2-20 進入Vi文本編輯器的方式
3.Vi的3種運行模式
Vi有3種基本工作模式:普通(normal)模式、插入(insert)模式和命令行(command-line或Cmdline)模式,如圖2-3所示。
進入Vi之后,首先進入的就是普通模式。進入普通模式后Vi等待編輯命令輸入而不是文本輸入,也就是說這時輸入的字母都將作為命令來解釋。在普通(normal)模式里,可以輸入所有的普通編輯命令。普通模式亦稱為命令(command)模式。
圖2-3 Vi的3種模式之間的轉換示意圖
進入普通模式后光標停在屏幕第一行首位上用_表示),其余各行的行首均有一個“~”符號,表示該行為空行。最后一行是狀態行,顯示出當前正在編輯的文件名及其狀態。如果是[New File],則表示該文件是一個新建的文件。如果輸入Vi之后帶有文件名參數,文件已在系統中存在,則在屏幕上顯示出該文件的內容,并且光標停在第一行的首位,在狀態行顯示出該文件的文件名、行數和字符數。
在普通模式下輸入插入命令i、附加命令a、打開命令o、修改命令c、取代命令r或替換命令s都可以進入插入模式。在插入模式下,用戶輸入的任何字符都被Vi當作文件內容保存起來,并將其顯示在屏幕上。在文本輸入過程中,若想回到命令行模式下,按〈Esc〉鍵即可。
在普通模式下,執行ex命令使用“:”,查找使用“?”和“/”,調用Shell命令使用“!”。多數文件管理命令都是在此模式下執行的。末行命令執行完后,Vi自動回到普通模式。
若在命令行模式下輸入命令過程中改變了主意,可用〈Back space〉鍵將輸入的命令全部刪除,之后再按一下〈Back space〉鍵,即可使Vi回到普通模式。關于這3個模式的轉換如圖2-3所示。
4.普通模式下的操作
表2-21至表2-27中列出了普通模式下的幾類命令。
表2-21 普通模式下進入插入模式
表2-22 普通模式下的光標定位
表2-23 普通模式下的替換和刪除
表2-24 普通模式下的復制和粘貼
表2-25 普通模式下的字符串搜索
表2-26 普通模式下的撤銷和重復
表2-27 在普通模式下退出Vi
5.命令模式下的操作
表2-28至表2-34中列出了在命令模式下的常用命令
表2-28 在命令模式下跳行
表2-29 在命令模式下搜索和替換字符串
表2-30 在命令模式下復制、移動和刪除文件行(塊
表2-31 在命令模式下的文件相關命令
表2-32 在命令模式下執行Shell命令
表2-33 在命令模式下設置Vi環境
表2-34 在命令模式下退出Vi
2.3 使用Shell
2.3.1 Shell變量和Shell環境
1.Shell 變量的分類
Shell 變量大致可以分為以下3類。
●內部變量:由系統提供,用戶只能使用不能修改。
●環境變量:這些變量決定了用戶工作的環境,不需要用戶定義,可以直接在Shell中使
用,其中某些變量用戶可以修改。
●用戶變量:由用戶建立和修改,也稱用戶自定義變量。在Shell腳本編寫中會經常用到。
2.Shell變量的定義和輸出
Shell支持具有字符串值的變量。Shell變量不需要專門的定義和初始化語句。一個沒有初始化的Shell變量被認為是空字符串。通常通過賦值語句完成變量說明并予以賦值,并且可以給一個變量多次賦值以改變其值。
在Shell中,變量的賦值使用如下語法格式。
其中:
●name是變量名,變量名是以字母或下畫線開頭的字母、數字和下畫線字符序列。用戶
自定義變量按照慣例使用小寫字母命名。
●“=”是賦值符號。兩邊不能直接跟空格,否則Shell將視為命令。
●string是被賦予的變量值。若string中包含空格、制表符和換行符,則string必須用
'string'或"string"的形式,即用單(雙)引號將其括起來。雙引號內允許變量替換,而
單引號則不可以。
通過在變量名(name)前加$字符,即用$name的形式引用變量的值,引用的結果就是用字符串string代替$name。此過程也稱為變量替換。在字符串連接過程中為了界定變量名、避免混淆,變量替換也可以使用${name}的形式。
變量輸出可使用Shell的內置命令echo(常用)或printf(用于格式化輸出,類似C語言的printf())。
下面給出一個定義和使用Shell變量的例子。
操作步驟2.1 定義和使用Shell變量舉例
3.Shell變量的作用域
Shell變量有其規定的作用范圍。Shell變量分為局部變量和全局變量。所有自定義變量默認都是局部變量;環境變量是全局變量。
●局部變量的作用范圍僅限制在其命令行所在的Shell或當前Shell腳本執行過程中。
● 全局變量的作用范圍則包括定義該變量的Shell及其所有子Shell。
可以使用export內置命令將局部變量設置為全局變量。export的常用格式為:
下面給出一個Shell變量作用域的例子
操作步驟2.2 Shell變量作用域舉例
重點
(1)在當前Shell中要想使用父輩Shell中的變量,至少要在當前Shell的父Shell中設置為全局變量。
(2)變量在子Shell中值的修改不會傳回父Shell。C
4.Shell環境變量
環境變量定義Shell的運行環境,保證Shell命令的正確執行。Shell用環境變量來確定查找路徑、注冊目錄、終端類型、終端名稱、用戶名等。所有環境變量都是全局變量(即可以傳遞給子Shell),并可以由用戶重新設置。表2-35中列出了一些系統中常用的環境變量。
表2-35 Shell中的環境變量
這些變量都是可寫的,用戶可以為它們賦任何值。如要使用自己的環境變量,則應該使用前面介紹的export命令。提示
1.用戶還可以使用不帶任何參數的env、printenv或export命令,顯示當前定義的所有環境變量。
2.要取消一個環境變量的聲明或賦值,也可以使用unset命令。
5.設置用戶工作環境
用戶登錄系統時,Shell為用戶自動定義唯一的工作環境,并對該環境進行維護直至用戶注銷。該環境將定義如身份、工作場所和正在運行的進程等特性。這些特性由指定的環境變量值定義。
Shell環境與辦公環境相似,在辦公室中每個人所處環境的物理特性,如燈光和溫度,但在辦公環境中又有許多因素是個人特有的,如日常工作和個人工作空間,因此用戶自己的工作環境就有別于其他用戶的工作環境。正如一個用戶的Shell環境不同于其他用戶的Shell環境。
用戶工作環境還有登錄環境和非登錄環境之分。登錄環境是指用戶登錄系統時的工作環境,此時的Shell對登錄用戶而言是主Shell。非登錄環境是指用戶在調用子Shell時所使用的用戶環境。
用戶并不需要每次登錄后都對各種環境變量進行手工設置,通過環境設置文件,用戶的工作環境的設置可以在登錄的時候自動由系統來完成。環境設置文件有兩種,一種是系統環境設置文件,另一種是個人環境設置文件。
(1)系統中的用戶工作環境設置文件(對所有用戶均生效)
●登錄環境設置文件:/etc/profile。
●非登錄環境設置文件:/etc/bashrc。
(2)用戶設置的環境設置文件(只對用戶自身生效)
●登錄環境設置文件:$HOME/.bash_profile。
●非登錄環境設置文件:$HOME/.bashrc。提示
1.工作環境設置文件是Shell腳本文件。
2.用戶可以修改自己的用戶環境設置文件,來覆蓋在系統環境設置文件中的全局設置。例如
(1)用戶可以將自定義的環境變量存放在$HOME/.bash_profile中。
(2)用戶可以將自定義的別名存放在$HOME/.bashrc中,以便在每次登錄和調用子Shell時生效。
2.3.2 幾種提高工作效率的方法
1.自動補全命令行
為了減少鍵盤輸入次數,bash提供了命令行自動補全功能,隨時按下〈Tab〉鍵,bash就能判斷出用戶所要自動補全的對象。可以自動補全的對象是:
●命令名(包括命令別名、Shell函數名)。
●Shell變量(bash將以$開頭的補全對象視為Shell變量)。
●用戶名(bash將以~開頭的補全對象視為用戶名,并解析為用戶的家目錄)。
●主機名(bash將以@開頭的補全對象視為主機名,并從/etc/hosts中查找補全對象)。
下面給出一些命令行補全的例子。
操作步驟2.3 命令行補全的例子
2.命令歷史
bash可以記錄一定數目的以前在Shell中輸入的命令。可以記錄歷史命令的數目由環境變量HISTSIZE的值指定。記錄歷史命令的文本文件由環境變量HISTFILE來指定,默認的記錄文件是.bash_history,這是一個隱含文件,位于用戶的宿主目錄下。
僅將先前的命令存在歷史文件里是沒有用的,將歷史命令記錄后,用戶如何使用它們呢?有如下幾種方式:
●最簡單的方法是用上下方向鍵、〈PgUp〉和〈PgDn〉鍵來查看歷史命令。
●如果需要,可以使用鍵盤上的編輯功能鍵對顯示在命令行上的命令進行編輯。
●用history命令來顯示和編輯歷史命令。
●用!<命令事件號>執行已經運行過的命令。
●用!<已經使用過的命令前面的部分>執行已經運行過的命令。
下面給出一個使用命令歷史操作的例子。
操作步驟2.4 使用命令歷史的例子
3.命令別名
命令別名是bash提供的另一個使用戶的工作變得輕松的方法。命令別名通常是其他命令的縮寫,用來減少鍵盤輸入。同時也允許用戶為命令另外取一個自己習慣使用的名字。
可以使用alias命令來達到上述目的。命令格式為:
其中alias_name是用戶給命令取的別名,original_command是原來的命令和參數。不使用任何參數來使用alias命令,將顯示當前的別名和其對應的原始命令。下面給出幾個使用命令別名操作的例子。操作步驟2.5使用命令別名的例子
注意
1.在定義別名時,等號兩邊不允許有空格存在,否則bash將不能確定用戶的意圖。若命令中包含空格或其他的特殊字符串則必須使用引號。
2.若系統中有一個命令,同時又定義了一個與之同名的別名(例如,系統中有ls命令,且又定義了ls的別名),則別名將優先于系統中原有命令的執行。要想臨時使用系統中的命令而非別名,應該在命令前添加轉義符“\”,例如,\ls命令將運行系統中原來的ls命令而不是ls別名,它不區分文件類型和顏色。
3.如果用戶需要別名的定義在每次登錄時均有效,應該將其寫入用戶私有目錄下的.bashrc文件中。
2.3.3 進一步使用Shell
1.重定向
Linux命令在執行時常常期望接收輸入數據,命令執行后又期望將產生的數據結果輸出Linux的大部分命令都具有標準的輸入/輸出設備端口。表2-36中列出了標準設備。
表2-36 標準設備
所謂重定向,就是不使用系統的標準輸入端口、標準輸出端口或標準錯誤端口,而進行重新的指定,所以重定向分為輸出重定向、輸入重定向和錯誤重定向。通常情況下重定向到一個文件。在Shell中,要實現重定向主要依靠重定向符實現,即Shell是檢查命令行中有無重定向符來決定是否需要實施重定向。表2-37中列出了常用的重定向符。
表2-37 重定向符
下面給出幾個使用重定向操作的例子
操作步驟2.6 使用重定向的例子
2.管道
許多Linux命令具有過濾特性,即一條命令通過標準輸入端口接收一個文件中的數據,命令執行后產生的結果數據又通過標準輸出端口送給后一條命令,作為該命令的輸入數據。后一條命令也是通過標準輸入端口而接收輸入數據。
Shell提供管道命令“|”將這些命令前后銜接在一起,形成一個管道線,格式為
管道線中的每一條命令都作為一個單獨的進程運行,每一條命令的輸出作為下一條命令的輸入。由于管道線中的命令總是從左到右順序執行的,因此管道線是單向的。
管道線的實現創建了Linux系統管道文件并進行重定向,但是管道不同于I/O重定向,輸入重定向導致一個程序的標準輸入來自某個文件,輸出重定向是將一個程序的標準輸出寫到一個文件中,而管道是直接將一個程序的標準輸出與另一個程序的標準輸入相連接,不需要經過任何中間文件。下面給出幾個使用管道的例子。 操作步驟2.7 使用管道的例子
3.命令替換
Shell中的命令參數可以由另一個命令執行的結果來替代。使用的格式如下
其中,cmd2 arguments的輸出作為cmd1的參數注意
cmd2要放在反引號“`”里。請注意反引號“`”和單引號“’”的區別,它們在功能上并不相同。
下面給出幾個使用命令替換的例子
操作步驟2.8 使用命令替換的例子
4.命令組合
除了可以使用管道連接若干命令之外,還可以在一個命令行上使用若干Shell的元字符將若干命令組合在一起,表2-38中列出了這些命令組合的方法及其說明。
表2-38 命令組合
下面給出幾個使用命令組合的例子操作步驟2.9 使用命令組合的例子
注意
當Here文件的內容包含變量替換和命令替換時,必須對$使用轉移符\$,否則會將變量替換和命令替換的結果存入輸出重定向的文件。行尾的續行符\,也應該使用轉義的\\,在使用Here文件形式生成Shell腳本時特別有用。
2.4 思考與實驗
1.思考
1)什么是Shell?具有什么功能?Linux默認使用什么Shell?
2)簡述文件的類型。硬鏈接和軟鏈接有何區別?
3)簡述Linux的標準目錄結構及其存放內容。
4)Linux的基本命令格式如何?Linux下經常使用的通配符有哪些
5)在Linux下如何使用設備?常用的設備名有哪些?
6)常用的文件和目錄操作命令有哪些?各自的功能是什么
7)常用的信息顯示命令有哪些?各自的功能是什么?
8)打包和壓縮有何不同?常用的打包和壓縮命令有哪些?
9)簡述在Shell中可以使用哪幾種方法提高工作效率。
10)Linux下的隱含文件如何標識?如何顯示?
11)Linux下經常使用-f和-r參數,它們的含義是什么?
12)Vi的3種運行模式是什么?如何切換?
13)什么是重定向?什么是管道?什么是命令替換?
14)Shell變量有哪兩種?分別如何定義?
15)如何設置用戶自己的工作環境?
16)比較下面命令的含義。
17)比較下面的特殊字符和操作熱鍵的含義
2.實驗
(1)瀏覽并熟悉Linux目錄結構。
(2)學會使用命令幫助。
(3)熟悉各種常用命令的使用。
(4)熟悉文本編輯器Vi的使用。
(5)熟悉并使用Shell的命令補全、命令歷史、命令別名。
(6)熟悉并使用Shell的重定向、管道、命令替換、命令組合。
(7)學會定義和輸出Shell變量。
(8)學會設置用戶自己的工作環境。
3.進一步學習
(1)學習使用Vundle(https://github.com/VundleVim/Vundle.vim)管理vim插件
(2)學習使用tmux和/或screen。