Linux命令行大全

Linux命令行大全

《Linux命令行大全》是2013年人民郵電出版社出版的圖書,作者是William E.shotts,Jr 。

內容簡介

《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文化中的一小部分,有著自己的語言和歷史。同時,我也許會說一些過激的言語。

相關詞條

熱門詞條

聯絡我們