內容簡介
《linux命令行大全》主要介紹linux命令行的使用,循序漸進,深入淺出,引導讀者全面掌握命令行的使用方法。
《linux命令行大全》分為四部分。第一部分開始了對命令行基本語言的學習之旅,包括命令結構、檔案系統的導引、命令行的編輯以及關於命令的幫助系統和使用手冊。第二部分主要講述配置檔案的編輯,用於計算機操作的命令行控制。第三部分講述了從命令行開始執行的常規任務。類unix作業系統,比如linux,包含了很多“經典的”命令行程式,這些程式可以高效地對數據進行操作。第四部分介紹了shell編程,這是一個公認的初級技術,並且容易學習,它可以使很多常見的系統任務自動運行。通過學習shell編程,讀者也可以熟悉其他程式語言的使用。
《linux命令行大全》適合從其他平台過渡到linux的新用戶和初級linux伺服器管理員閱讀。沒有任何linux基礎和linux編程經驗的讀者,也可以通過本書掌握linux命令行的使用方法。
作者簡介
William E.Shotts,Jr.作為一名軟體開發人員和狂熱的Linux用戶已經有15年之久。他在軟體開發領域有深厚的背景,先後涉及過技術支持、質量保證和文檔編寫等工作。他還是Linux Command.org網站的創始人,該網站是一個Linux教育和宣傳網站,以新聞、評論和為人們使用Linux命令行提供廣泛支持而見長。
目錄
《linux命令行大全》
第一部分 學習shell
第1章 shell是什麼 3
1.1 終端仿真器 3
1.2 第一次鍵盤輸入 4
1.2.1 命令歷史記錄 4
1.2.2 游標移動 4
1.3 幾個簡單的命令 5
1.4 結束終端會話 6
第2章 導航 7
2.1 理解檔案系統樹 7
2.2 當前工作目錄 8
2.3 列出目錄內容 9
2.4 更改當前工作目錄 9
2.4.1 絕對路徑名 9
2.4.2 相對路徑名 9
2.4.3 一些有用的捷徑 10
第3章 linux系統 13
3.1 ls命令的樂趣 13
3.1.1 選項和參數 14
.3.1.2 進一步了解長列表格式 15
3.2 使用file命令確定檔案類型 16
3.3 使用less命令查看檔案內容 16
3.4 快速瀏覽 18
3.5 符號連結 20
第4章 操作檔案與目錄 23
4.1 通配符 24
4.2 mkdir——創建目錄 26
4.3 cp——複製檔案和目錄 26
4.4 mv——移除和重命名檔案 27
4.5 rm——刪除檔案和目錄 28
4.6 ln——創建連結 29
4.6.1 硬連結 29
4.6.2 符號連結 30
4.7 實戰演練 30
4.7.1 創建目錄 30
4.7.2 複製檔案 31
4.7.3 移動和重命名檔案 31
4.7.4 創建硬連結 32
4.7.5 創建符號連結 33
4.7.6 移除檔案和目錄 34
4.8 本章結尾語 35
第5章 命令的使用 37
5.1 究竟什麼是命令 38
5.2 識別命令 38
5.2.1 type——顯示命令的類型 38
5.2.2 which——顯示可執行程式的位置 39
5.3 獲得命令文檔 39
5.3.1 help——獲得shell內置命令的幫助文檔 39
5.3.2 help——顯示命令的使用信息 40
5.3.3 man——顯示程式的手冊頁 40
5.3.4 apropos——顯示合適的命令 41
5.3.5 whatis——顯示命令的簡要描述 42
5.3.6 info——顯示程式的info條目 42
5.3.7 readme和其他程式文檔檔案 43
5.4 使用別名創建自己的命令 43
5.5 溫故以求新 45
第6章 重定向 47
6.1 標準輸入、標準輸出和標準錯誤 48
6.1.1 標準輸出重定向 48
6.1.2 標準錯誤重定向 50
6.1.3 將標準輸出和標準錯誤重定向到同一個檔案 50
6.1.4 處理不想要的輸出 51
6.1.5 標準輸入重定向 51
6.2 管道 53
6.2.1 過濾器 53
6.2.2 uniq——報告或忽略檔案中重複的行 54
6.2.3 wc——列印行數、字數和位元組數 54
6.2.4 grep——列印匹配行 54
6.2.5 head/tail——輸出檔案的開頭部分/結尾部分 55
6.2.6 tee——從stdin讀取數據,並同時輸出到stdout和檔案 56
6.3 本章結尾語 57
第7章 透過shell看世界 59
7.1 擴展 59
7.1.1 路徑名擴展 60
7.1.2 波浪線擴展 61
7.1.3 算術擴展 61
7.1.4 花括弧擴展 62
7.1.5 參數擴展 63
7.1.6 命令替換 64
7.2 引用 65
7.2.1 雙引號 65
7.2.2 單引號 67
7.2.3 轉義字元 67
7.3 本章結尾語 68
第8章 高級鍵盤技巧 69
8.1 編輯命令行 69
8.1.1 游標移動 70
8.1.2 修改文本 70
8.1.3 剪下和貼上(killing and yanking)文本 71
8.2 自動補齊功能 71
8.3 使用歷史命令 73
8.3.1 搜尋歷史命令 73
8.3.2 歷史記錄擴展 75
8.4 本章結尾語 76
第9章 許可權 77
9.1 所有者、組成員和其他所有用戶 78
9.2 讀取、寫入和執行 79
9.2.1 chmod——更改檔案模式 81
9.2.2 採用gui設定檔案模式 84
9.2.3 umask——設定默認許可權 85
9.3 更改身份 87
9.3.1 su——以其他用戶和組id的身份來運行shell 88
9.3.2 sudo——以另一個用戶的身份執行命令 89
9.3.3 chown——更改檔案所有者和所屬群組 90
9.3.4 chgrp——更改檔案所屬群組 91
9.4 許可權的使用 91
9.5 更改用戶密碼 93
第10章 進程 95
10.1 進程如何工作 96
10.1.1 使用ps命令查看進程信息 96
10.1.2 使用top命令動態查看進程信息 98
10.2 控制進程 100
10.2.1 中斷進程 100
10.2.2 使進程在後台運行 101
10.2.3 使進程回到前台運行 101
10.2.4 停止(暫停)進程 102
10.3 信號 102
10.3.1 使用kill命令傳送信號到進程 103
10.3.2 使用killall命令傳送信號給多個進程 105
10.4 更多與進程相關的命令 105
第二部分 配置與環境
第11章 環境 109
11.1 環境中存儲的是什麼 109
11.1.1 檢查環境 110
11.1.2 一些有趣的變數 111
11.2 環境是如何建立的 112
11.2.1 login和non-login shell 112
11.2.2 啟動檔案中有什麼 113
11.3 修改環境 114
11.3.1 用戶應當修改哪些檔案 114
11.3.2 文本編輯器 115
11.3.3 使用文本編輯器 115
11.3.4 激活我們的修改 117
11.4 本章結尾語 118
第12章 vi簡介 119
12.1 為什麼要學習vi 119
12.2 vi背景 120
12.3 啟動和退出vi 120
12.4 編輯模式 121
12.4.1 進入插入模式 122
12.4.2 保存工作 122
12.5 移動游標 123
12.6 基本編輯 124
12.6.1 添加文本 124
12.6.2 插入一行 125
12.6.3 刪除文本 126
12.6.4 剪下、複製和貼上文本 127
12.6.5 合併行 128
12.7 查找和替換 128
12.7.1 行內搜尋 128
12.7.2 搜尋整個檔案 129
12.7.3 全局搜尋和替換 129
12.8 編輯多個檔案 130
12.8.1 切換檔案 131
12.8.2 載入更多的檔案 132
12.8.3 檔案之間的內容複製 132
12.8.4 插入整個檔案 133
12.9 保存工作 134
第13章 定製提示符 135
13.1 提示符的分解 135
13.2 嘗試設計提示符 137
13.3 添加顏色 138
13.4 移動游標 140
13.5 保存提示符 141
13.6 本章結尾語 141
第三部分 常見任務和主要工具
第14章 軟體包管理 145
14.1 軟體包系統 146
14.2 軟體包系統工作方式 146
14.2.1 軟體包檔案 146
14.2.2 庫 147
14.2.3 依賴關係 147
14.2.4 高級和低級軟體包工具 147
14.3 常見軟體包管理任務 148
14.3.1 在庫裡面查找軟體包 148
14.3.2 安裝庫中的軟體包 148
14.3.3 安裝軟體包檔案中的軟體包 149
14.3.4 刪除軟體包 149
14.3.5 更新庫中的軟體包 150
14.3.6 更新軟體包檔案中的軟體包 150
14.3.7 列出已安裝的軟體包列表 150
14.3.8 判斷軟體包是否安裝 151
14.3.9 顯示已安裝軟體包的相關信息 151
14.3.10 查看某具體檔案由哪個軟體包安裝得到 151
14.4 本章結尾語 152
第15章 存儲介質 155
15.1 掛載、卸載存儲設備 156
15.1.1 查看已掛載的檔案系統列表 157
15.1.2 確定設備名稱 160
15.2 創建新的檔案系統 162
15.2.1 用fdisk命令進行磁碟分區 162
15.2.2 用mkfs命令創建新的檔案系統 164
15.3 測試、修復檔案系統 165
15.4 格式化軟碟 166
15.5 直接從/向設備轉移數據 166
15.6 創建cd-rom映像 167
15.6.1 創建一個cd-rom檔案映像副本 167
15.6.2 從檔案集合中創建映像檔案 168
15.7 向cd-rom寫入映像檔案 168
15.7.1 直接掛載iso映像檔案 168
15.7.2 擦除可讀寫cd-rom 169
15.7.3 寫入映像檔案 169
15.8 附加認證 169
第16章 網路 171
16.1 檢查、監測網路 172
16.1.1 ping——向網路主機傳送特殊數據包 172
16.1.2 traceroute——跟蹤網路數據包的傳輸路徑 173
16.1.3 netstat——檢查網路設定及相關統計數據 174
16.2 通過網路傳輸檔案 175
16.2.1 ftp——採用ftp(檔案傳輸協定)傳輸檔案 175
16.2.2 lftp——更好的ftp(檔案傳輸協定) 177
16.2.3 wget——非互動式網路下載工具 177
16.3 與遠程主機的安全通信 178
16.3.1 ssh——安全登錄遠程計算機 178
16.3.2 scp和sftp——安全傳輸檔案 181
第17章 檔案搜尋 183
17.1 locate——較簡單的方式查找檔案 184
17.2 find——較複雜的方式查找檔案 185
17.2.1 test選項 186
17.2.2 action選項 190
17.2.3 返回到playground資料夾 194
17.2.4 option選項 196
第18章 歸檔和備份 197
18.1 檔案壓縮 198
18.1.1 gzip——檔案壓縮與解壓縮 198
18.1.2 bzip2——犧牲速度以換取高質量的數據壓縮 200
18.2 檔案歸檔 201
18.2.1 tar——磁帶歸檔工具 201
18.2.2 zip——打包壓縮檔案 205
18.3 同步檔案和目錄 207
18.3.1 rsync——遠程檔案、目錄的同步 207
18.3.2 在網路上使用rsync命令 209
第19章 正則表達式 211
19.1 什麼是正則表達式 211
19.2 grep——文本搜尋 212
19.3 元字元和文字 213
19.4 任意字元 214
19.5 錨 214
19.6 中括弧表達式和字元類 215
19.6.1 否定 216
19.6.2 傳統字元範圍 216
19.6.3 posix字元類 217
19.7 posix基本正則表達式和擴展正則表達式的比較 220
19.8 或選項 221
19.9 限定符 222
19.9.1 ?——匹配某元素0次或1次 222
19.9.2 *——匹配某元素多次或零次 222
19.9.3 +——匹配某元素一次或多次 223
19.9.4 {}——以指定次數匹配某元素 223
19.10 正則表達式的套用 224
19.10.1 用grep命令驗證號碼簿 224
19.10.2 用find查找奇怪檔案名稱的檔案 225
19.10.3 用locate查找檔案 226
19.10.4 利用less和vim命令搜尋文本 226
19.11 本章結尾語 227
第20章 文本處理 229
20.1 文本應用程式 230
20.1.1 檔案 230
20.1.2 網頁 230
20.1.3 電子郵件 230
20.1.4 印表機輸出 231
20.1.5 程式原始碼 231
20.2 溫故以求新 231
20.2.1 cat——進行檔案之間的拼接並且輸出到標準輸出 231
20.2.2 sort——對文本行進行排序 232
20.2.3 uniq——通知或省略重複的行 238
20.3 切片和切塊 239
20.3.1 cut——刪除文本行中的部分內容 239
20.3.2 paste——合併文本行 242
20.3.3 join——連線兩檔案中具有相同欄位的行 243
20.4 文本比較 245
20.4.1 comm——逐行比較兩個已排序檔案 245
20.4.2 diff——逐行比較檔案 246
20.4.3 patch——對原檔案進行diff操作 248
20.5 非互動式文本編輯 249
20.5.1 tr——替換或刪除字元 249
20.5.2 sed——用於文本過濾和轉換的流編輯器 251
20.5.3 aspell——互動式拼寫檢查工具 258
20.6 本章結尾語 260
20.7 附加項 261
第21章 格式化輸出 263
21.1 簡單的格式化工具 264
21.1.1 nl——對行進行標號 264
21.1.2 fold——將文本中的行長度設定為指定長度 266
21.1.3 fmt——簡單的文本格式化工具 267
21.1.4 pr——格式化列印文本 270
21.1.5 printf——格式化並列印數據 270
21.2 文檔格式化系統 273
21.2.1 roff和tex家族 274
21.2.2 groff——文檔格式化系統 274
21.3 本章結尾語 279
第22章 列印 281
22.1 列印操作簡史 282
22.1.1 灰暗時期的列印 282
22.1.2 基於字元的印表機 282
22.1.3 圖形化印表機 283
22.2 linux方式的列印 284
22.3 準備列印檔案 284
22.3.1 pr——將文本檔案轉換為列印檔案 285
22.4 向印表機傳送列印任務 285
22.4.1 lpr——列印檔案(berkeley類型) 286
22.4.2 lp——列印檔案(system v類型) 287
22.4.3 另外一個參數選項:a2ps 287
22.5 監測和控制列印任務 290
22.5.1 lpstat——顯示列印系統狀態 290
22.5.2 lpq——顯示列印佇列狀態 291
22.5.3 lprm與cancel——刪除列印任務 291
第23章 編譯程式 293
23.1 什麼是編譯 294
23.2 是不是所有的程式都需要編譯 295
23.3 編譯一個c程式 295
23.3.1 獲取原始碼 296
23.3.2 檢查原始碼樹 297
23.3.3 生成程式 298
23.3.4 安裝程式 302
23.4 本章結尾語 302
第四部分 編寫shell腳本
第24章 編寫第一個shell腳本 305
24.1 什麼是shell腳本 305
24.2 怎樣寫shell腳本 306
24.2.1 腳本檔案的格式 306
24.2.2 可執行許可權 307
24.2.3 腳本檔案的位置 307
24.2.4 腳本的理想位置 308
24.3 更多的格式訣竅 309
24.3.1 長選項名 309
24.3.2 縮進和行連線 309
24.5 本章結尾語 310
第25章 啟動一個項目 311
25.1 第一階段:最小的文檔 311
25.2 第二階段:加入一點數據 313
25.3 變數和常量 314
25.3.1 創建變數和常量 314
25.3.2 為變數和常量賦值 316
25.4 here文檔 317
25.5 本章結尾語 319
第26章 自頂向下設計 321
26.1 shell函式 322
26.2 局部變數 325
26.3 保持腳本的運行 326
26.4 本章結尾語 328
第27章 流控制:if分支語句 329
27.1 使用if 330
27.2 退出狀態 330
27.3 使用test命令 332
27.3.1 檔案表達式 332
27.3.2 字元串表達式 334
27.3.3 整數表達式 335
27.4 更現代的test命令版本 336
27.5 (( ))——為整數設計 338
27.6 組合表達式 339
27.7 控制運算符:另一種方式的分支 341
27.8 本章結尾語 342
第28章 讀取鍵盤輸入 343
28.1 read——從標準輸入讀取輸入值 344
28.1.1 選項 346
28.1.2 使用ifs間隔輸入欄位 347
28.2 驗證輸入 349
28.3 選單 350
28.4 本章結尾語 351
28.5 附加項 352
第29章 流控制:while和until循環 353
29.1 循環 353
29.2 while 354
29.3 跳出循環 356
29.4 until 357
29.5 使用循環讀取檔案 358
29.6 本章結尾語 358
第30章 故障診斷 359
30.1 語法錯誤 359
30.1.1 引號缺失 360
30.1.2 符號缺失冗餘 360
30.1.3 非預期的展開 361
30.2 邏輯錯誤 362
30.2.1 防禦編程 363
30.2.2 輸入值驗證 364
30.3 測試 364
30.3.1 樁 365
30.3.2 測試用例 365
30.4 調試 366
30.4.1 找到問題域 366
30.4.2 追蹤 366
30.4.3 運行過程中變數的檢驗 368
30.5 本章結尾語 369
第31章 流控制:case分支 371
31.1 case 371
31.1.1 模式 373
31.1.2 多個模式的組合 374
31.2 本章結尾語 375
第32章 位置參數 377
32.1 訪問命令行 377
32.1.1 確定實參的數目 378
32.1.2 shift——處理大量的實參 379
32.1.3 簡單的應用程式 380
32.1.4 在shell函式中使用位置參數 381
32.2 處理多個位置參數 381
32.3 更完整的應用程式 383
32.4 本章結尾語 386
第33章 流控制:for循環 389
33.1 for:傳統shell形式 389
33.2 for:c語言形式 392
33.3 本章結尾語 393
第34章 字元串和數字 395
34.1 參數擴展(parameter expansion) 395
34.1.1 基本參數 396
34.1.2 空變數擴展的管理 396
34.1.3 返回變數名的擴展 397
34.1.4 字元串操作 398
34.2 算術計算和擴展 400
34.2.1 數字進制 401
34.2.2 一元運算符 401
34.2.3 簡單算術 401
34.2.4 賦值 402
34.2.5 位操作 404
34.2.6 邏輯操作 405
34.3 bc:一種任意精度計算語言 407
34.3.1 bc的使用 407
34.3.2 腳本例子 408
34.4 本章結尾語 409
34.5 附加項 409
第35章 數組 411
35.1 什麼是數組 411
35.2 創建一個數組 412
35.3 數組賦值 412
35.4 訪問數組元素 413
35.5 數組操作 414
35.5.1 輸出數組的所有內容 415
35.5.2 確定數組元素的數目 415
35.5.3 查找數組中使用的下標 416
35.5.4 在數組的結尾增加元素 416
35.5.5 數組排序操作 416
35.5.6 數組的刪除 417
35.6 本章結尾語 418
第36章 其他命令 419
36.1 組命令和子shell 419
36.1.1 執行重定向 420
36.1.2 進程替換 420
36.2 trap 422
36.3 異步執行 425
36.4 命名管道 426
36.4.1 設定命名管道 427
36.4.2 使用命名管道 427
36.5 本章結尾語 428
前言
我想給大家講一個故事。故事內容不是Linus Torvalds在1991年怎樣編寫了Linux核心的第一個版本,因為這些內容你可以在很多Linux圖書中找到。我也不想告訴你,更早之前,Richard Stallman是如何開始GNU項目,設計了一個免費的類UNIX作業系統。那也是一個很有意義的故事,但大多數Linux圖書也講到了它。我想給大家講一個如何才能奪回計算機控制權的故事。
在20世紀70年代後期,我剛開始和計算機打交道時,正在進行著一場革命,那時的我還是一名大學生。微處理器的發明使得你我這樣的普通人真正擁有一台計算機成為可能。今天,人們難以想像,只有大公司和強大的政府機構才能夠使用計算機的世界,是怎樣的一個世界。讓我說,你其實想像不出多少宋。
如今,世界已經截然不同。計算機遍布各個領域,從小手錶到大型數據中心,以及介於它們之間的每一樣東西。除了隨處可見的計算機之外,我們還有一個無處不在的連線所有計算機的網路。這開創了一個奇妙的個人授權和創作自由的新時代。但是在過去的二三十年里,一些事情在悄然發生。一個大公司不斷地把它的控制權強加到世界絕大多數的計算機上,並且決定你對計算機的操作權力。幸運的是,世界各地的人們正在努力進行抗爭。他們通過自己編寫軟體來爭奪自己計算機的控制權。他們創造了Linux!
很多人提到Linux的時候都會講到“自由”,但是並不是所有人都明白這種自由到底意味著什麼。自由就是能夠決定計算機可以做什麼,而獲得這種自由的唯一方法就是知道你的計算機正在做什麼;自由就是計算機沒有秘密可言,只要你仔細地尋找,就能了解其全部內容。
為什麼使用命令行
讀者之前應該注意到,電影中的“超級黑客”,就是那些能夠在30秒內入侵到超級安全的軍方計算機里的傢伙,都是坐在計算機旁,從來不碰滑鼠的。這是因為電影製片人意識到,我們人類從本能上會明白,能夠讓計算機執行任何任務的唯一途徑,是通過鍵盤輸入命令來實現的。
現在,大多數計算機用戶只熟悉圖形用戶界面(GUI),並且產品供應商和專家還在不停地灌輸一種思想,那就是命令行界面(CLI)是一種很糟糕的東西,而且已經過時。這是很不幸的,因為一個好的命令行界面是一種很神奇的人機互動方式,就和我們採用書信進行交流一樣。據說“圖形用戶界面能讓簡單的任務更簡單,而命令行界面能夠處理複雜的任務”,這句話在今天看來仍然是正確的。
由於Linux系統參照了UNIX系列作業系統,它分享了UNIX系統豐富的命令行工具。UNIX系統在20世紀80年代早期就占據了主流地位(儘管它只是在20世紀70年代才開發出來),結果,在普遍採用圖形用戶界面之前,開發了一種廣泛使用的命令行界面。事實上,Linux開發者優先使用命令行界面(而不是其他系統,比如WindowsNT)的一個原因就是因為其強大的命令行界面,使“完成複雜的任務成為可能”。
本書內容
這是一本全面講述如何使用Linux命令行的圖書。與那些僅涉及一個程式(比如shell程式、bash)的圖書不同,本書從更廣泛的意義上向讀者傳授如何使用命令行,它是如何工作的,它有哪些功能,以及使用它的最佳方式是什麼。
這不是一本關於Linux系統管理方面的圖書。任何一個關於命令行的重要討論,都一定會涉及系統管理方面的內容,但是本書只涉及很少的管理方面的問題。本書為讀者準備了其他的學習內容,幫助你為使用命令行打下堅實的基礎,這可是完成一個系統管理任務所必需的至關重要的工具。
本書以Linux為中心。其他許多圖書為了擴大讀者群體以及自身的影響力,會在書中包含其他平台,比如通用的UNIX和Mac OS X系統。而且為了達到這個目的,它們只能“淡化”書的內容,只講解一些通用的主題。而本書只包括當前的Linux發行版本。儘管本書95%的內容對其他類UNIX系統用戶也有幫助,但是本書主要還是面向現代的Linux命令行用戶。
本書讀者對象
本書適合從其他平台轉到Linux的新用戶閱讀。這些新用戶很可能原來是Microsoft Windows版本的超級用戶;也可能是老闆已經要求負責管理一個Linux伺服器的管理員;還有可能是厭煩了桌面系統的安全問題,想要體驗一下Linux系統的用戶。沒關係,不管你屬於哪類用戶,都歡迎閱讀本書。
不過一般來說,Linux的啟蒙學習不存在任何捷徑。命令行的學習具有挑戰性而且頗費精力,這倒不是因為它太難,而是它涵蓋的內容太多。一般的Linux 系統有上千個程式可以通過命令行使用,這點毫不誇張。你需要提醒自己的是,命令行可不是隨便就能學會的。
另一方面,學習Linux命令行也非常值得。如果你認為自己已經是一名“超級用戶”了,那么請注意,你可能不知道什麼才是真正的“超級用戶”。不同於許多其他的計算機技術,命令行的知識是經久不衰的。今天學會的技能,在10年後仍然有用。換言之,命令行是能夠歷經時間考驗的。
如果讀者沒有編程經驗,也不用擔心,你仍然可以從本書開始學習。
內容安排
本書精心編排,內容有序,就像有一位老師坐在你身旁,耐心指導你。許多作者都採用系統化的方法來講解本書中的內容。對作者來講,這很合理,但是對初學者來講,則可能摸不著頭腦。
本書的另一個目的是使讀者熟悉UNIX的思考方式,它與Windows的思考方式大不相同。在學習的過程中,本書還將幫助讀者理解命令行的工作原理和方式。Linux不僅僅是一個軟體,它還是龐大的UNIX文化中的一小部分,有著自己的語言和歷史。同時,我也許會說一些過激的言語。