William Shotts:the Linux Command Line (文档版本 19.01)
這份文件是《The Linux Command Line》第五版線上版的目錄及版權資訊摘錄。其主要論點及詳盡解釋如下:
這本書的核心主旨是引導讀者深入了解和精通 Linux 命令列介面 (CLI),藉此讓使用者重拾對電腦的掌握與控制權。作者 William Shotts 認為,不同於圖形使用者介面 (GUI) 主要使「簡易任務變得簡單」,命令列能使「困難任務變得可能」。他強調,真正獲得電腦自由的途徑在於理解其運作,而命令列作為 Linux(繼承 Unix 血統)與使用者互動的核心方式,提供了這種透明度和能力。這本書旨在為讀者提供一個全面的視角,教導如何在命令列環境中「生活」,而不僅僅是學習單一的 shell(如 bash)或特定程式。
以下是本書涵蓋的主要論點和內容架構:
-
擁抱命令列的理由與哲學:
- 作者開宗明義闡述使用命令列的必要性與優勢,認為它是與電腦交流的高度表達性方式,並且是實現真正控制權和「自由」的關鍵。
- 強調 Linux 的開放性,認為系統沒有秘密,一切皆可探索與知曉,這與某些專有系統形成對比。
- 指出學習命令列的挑戰(廣泛性)和回報(強大的能力和持久的技能)。
- 提及「GNU/Linux」的命名爭議,作者選擇使用「Linux」以符合大眾習慣和市場偏好,但也承認 GNU 計畫的巨大貢獻。
-
書籍的目標讀者與閱讀方式:
- 本書主要針對新的 Linux 使用者,特別是從其他平台(如 Windows)轉移過來的「進階使用者」,也適合需要管理 Linux 伺服器、使用單板電腦(如 Raspberry Pi)或僅想嘗試 Linux 桌面的用戶。
- 建議讀者從頭到尾依序閱讀,本書設計為一套循序漸進的教程,而非參考手冊。強調「動手實踐」,鼓勵讀者在自己的 Linux 系統上跟隨練習。
-
書籍內容的架構(分為四個部分進行詳盡解釋):
-
第一部分:學習 Shell (Learning the Shell)
- 什麼是 Shell: 介紹 Shell 的基本概念(程式接受鍵盤命令並傳給作業系統),特別是 bash (Bourne Again SHell)。介紹終端機模擬器(如 konsole, gnome-terminal)作為與 shell 互動的 GUI 程式。涵蓋初次按鍵、命令歷史、游標移動、簡單命令執行(如 date, cal, df, free)以及結束終端機會話的方法。
- 檔案系統導航 (Navigation): 講解 Linux 的階層式檔案系統樹(根目錄 /),與 Windows 多樹結構的對比。介紹目前工作目錄(pwd)的概念。學習如何在檔案系統中移動(cd)和列出目錄內容(ls)。區分絕對路徑(從根目錄開始)和相對路徑(從當前目錄開始,使用 . 和 ..)。提及一些導航捷徑(如 ~)。強調檔案名稱的重要事實(區分大小寫、隱藏檔案、無強制副檔名、避免使用空格等)。
- 探索系統 (Exploring the System): 深入使用 ls 命令及其選項(如 -l, -a, -h, -t)以獲取更多檔案和目錄的詳細資訊(權限、連結數、所有者、群組、大小、修改時間)。學習 file 命令來判斷檔案類型。介紹 less 命令來分頁查看文字檔案內容,解釋「文字」的概念(ASCII)與文書處理器文件的不同。引導讀者探索 Linux 系統的重要目錄(如 /bin, /etc, /home, /usr, /var),解釋它們各自的用途。介紹符號連結(軟連結)和硬連結的概念及其區別和用途。
- 操作檔案和目錄 (Manipulating Files and Directories): 介紹 Shell 的萬用字元(*、?、[]、[!]]、[[:class:]]),解釋它們如何擴展為檔案名稱列表。學習建立目錄(mkdir)、複製檔案和目錄(cp)及其常用選項(如 -i, -r, -a, -u, -v)。學習移動和重新命名檔案(mv)及其選項。學習移除檔案和目錄(rm)及其選項(如 -i, -r, -f, -v),強調 rm 的危險性(無復原)和使用注意事項。再次講解建立連結(ln),區分硬連結和符號連結的底層機制和限制。透過建立「練習場」目錄,讓讀者實際操作這些命令。
- 使用命令 (Working with Commands): 解釋命令的四種形式:可執行程式、Shell 內建命令、Shell 函數、別名(alias)。學習 type 和 which 命令來識別命令的類型和位置。介紹獲取命令文件的方法:Shell 內建命令的 help、大多數程式的 –help 選項、man 手冊頁(分區)、apropos(按關鍵字搜索 man 頁面)、whatis(單行描述)、info(GNU 程式的超連結文件)、以及 README 等檔案。學習如何使用 alias 命令建立自己的命令別名。
- 重新導向 (Redirection): 介紹標準輸入 (stdin)、標準輸出 (stdout) 和標準錯誤 (stderr) 的概念,以及它們預設的來源和目的地(鍵盤和螢幕)。學習使用 > 和 >> 運算子重導向標準輸出到檔案(覆寫與附加),以及 2> 運算子重導向標準錯誤。學習如何將標準輸出和標準錯誤重導向到同一檔案(2>&1 或 &>)。介紹 /dev/null 檔案用於捨棄不需要的輸出。學習使用 < 運算子重導向標準輸入。介紹 cat 命令及其用途(串聯檔案、從 stdin 讀取)。介紹管道 (pipelines),使用 | 運算子連接多個命令的標準輸出和標準輸入。介紹過濾器(filters)的概念以及一些常用過濾器命令(sort, uniq, wc, grep, head, tail, tee)。強調 > 與 | 的區別和使用注意事項。
- Shell 的視角 (Seeing the World as the Shell Sees It): 深入探討 Shell 在執行命令前執行的「擴展」(expansion) 過程。講解路徑名稱擴展(萬用字元)、波浪號擴展(使用者家目錄)、算術擴展(基本的數學計算)、括號擴展(生成字串序列)、參數擴展(變數值的替換)和命令替換(命令輸出的替換)。講解「引用」(quoting) 的概念及其方法(雙引號 “”、單引號 ”、反斜線逸出 \)以及它們如何抑制不同類型的擴展。解釋單引號抑制所有擴展,雙引號抑制部分擴展(允許參數擴展、算術擴展、命令替換),反斜線逸出單個字元。
- 進階鍵盤技巧 (Advanced Keyboard Tricks): 介紹 Readline 函式庫提供的命令列編輯功能,包括游標移動、文字修改、剪下與貼上(Killing 與 Yanking)。介紹命令列補全(Completion)功能,如何利用 Tab 鍵補全命令、檔案名等,以及可程式化補全的概念。介紹命令歷史的使用(向上/向下箭頭、history 命令),如何搜索歷史(Ctrl-r)和利用歷史擴展 (!) 重新執行或引用先前的命令。提及 script 命令用於記錄整個 Shell 會話。
- 權限 (Permissions): 介紹 Linux 的多使用者性質以及檔案權限的重要性。講解檔案權限模型中的三種主體:所有者 (owner)、群組成員 (group member) 和其他人 (everybody else/world)。講解三種權限:讀取 (read)、寫入 (write) 和執行 (execute) 以及它們對於檔案和目錄的不同含義。解釋 ls -l 輸出的權限表示。介紹 chmod 命令更改檔案模式(權限),使用八進制和符號表示法。解釋八進制權限的由來。介紹 umask 命令設置預設權限。提及特殊權限:setuid、setgid、sticky bit。介紹改變身份的方法:su(切換使用者,通常為 root)和 sudo(以另一個使用者身份執行命令),解釋 Ubuntu 使用 sudo 的偏好及原因。介紹 chown 改變所有者和群組、chgrp 改變群組。透過設定共享目錄的例子,實際應用權限知識。介紹 passwd 命令改變使用者密碼。
- 行程 (Processes): 介紹行程的概念(執行中的程式)以及 Linux 如何管理行程。講解父子行程關係。介紹查看行程的命令 ps(靜態快照)及其選項(如 x, aux)以及 top(動態實時顯示)。解釋行程狀態(運行、睡眠、停止、僵屍等)。介紹控制行程的命令:中斷(Ctrl-c)、放入背景(&, bg)、拉回前景(fg)、停止/暫停(Ctrl-z, stop)。講解信號(signals)的概念(如 INT, TERM, KILL, STOP, TSTP, HUP, CONT)以及 kill 命令發送信號給行程。介紹 killall 按名稱殺死多個行程。介紹系統關機/重啟命令 halt, poweroff, reboot, shutdown。提及其他與行程相關的命令(pstree, vmstat, xload, tload)。
-
第二部分:配置與環境 (Configuration and the Environment)
- 環境 (The Environment): 介紹 Shell 環境的概念,其中儲存著影響程式行為的環境變數和 Shell 變數。學習 printenv 和 set 命令查看環境內容。介紹一些有趣的環境變數(如 PATH, HOME, USER, PS1, TERM, DISPLAY, LANG)。解釋環境是如何建立的(透過讀取啟動檔案 – /etc/profile, ~/.bash_profile, ~/.bashrc 等),區分登入 Shell 和非登入 Shell 的啟動檔案讀取順序。分析典型的啟動檔案內容,解釋 PATH 變數的意義和修改方法。學習 export 命令使變數對子行程可見。介紹修改環境的方法(編輯啟動檔案)以及修改哪些檔案的建議(個人化通常修改 ~/.bashrc)。
- vi 編輯器簡介 (A Gentle Introduction to vi): 介紹為什麼要學習 vi 編輯器(幾乎總是可用、輕量快速、Unix 文化中的重要工具)。介紹 vi 的歷史(Bill Joy)及其後繼者 vim。學習啟動和停止 vi(:q, :q!),以及 vi 的「模式」(命令模式、插入模式)。學習如何在命令模式下進入插入模式(i, a, A, o, O)。學習在命令模式下移動游標、刪除文字(x, d 加移動命令,如 dd, dW)以及剪下、複製和貼上文字(d, y 加移動命令,p, P)。學習合併行(J)。學習搜尋和替換(/, ?, n 加正則表達式,:%s///g)。學習同時編輯多個檔案(指定多個檔案啟動、:bn, :bp 切換、:e 開啟更多),以及在不同檔案間複製內容。學習將整個檔案插入到當前檔案中(:r)。學習儲存工作(:w, :wq, ZZ)。
- 自訂提示符號 (Customizing the Prompt): 分析 Shell 提示符號的組成部分(例如:user@host workdir $),解釋其定義由 PS1 環境變數控制。介紹 PS1 中常用的反斜線逸出碼(如 \u, \h, \W, \$, \t, \d, \w)以顯示各種資訊。學習如何修改 PS1 來改變提示符號的外觀。介紹使用 ANSI 逸出碼為提示符號添加顏色(文字顏色和背景顏色),以及控制游標位置的逸出碼。學習如何將自訂提示符號儲存到 ~/.bashrc 中使其永久生效。
-
第三部分:常見任務與基本工具 (Common Tasks and Essential Tools)
- 套件管理 (Package Management): 介紹套件管理系統的重要性(應對軟體頻繁更新、安裝軟體)。解釋套件系統的運作方式(套件檔案、軟體庫/Repository、依賴關係Dependency)。介紹高階工具(處理依賴和軟體庫)和低階工具(處理套件檔案)的區別。介紹主要的套件系統家族:Debian 式(.deb,使用 dpkg, apt-get, aptitude)和 Red Hat 式(.rpm,使用 rpm, yum, dnf)。講解常見套件管理任務的命令:查找、安裝(從軟體庫和套件檔案)、移除、更新、升級(從套件檔案)、列出已安裝、檢查是否已安裝、顯示資訊、查找安裝某個檔案的套件。駁斥「Linux 軟體安裝困難」的迷思,解釋其開放性帶來的便利和設備驅動程式的處理方式。
- 儲存媒體 (Storage Media): 介紹 Linux 如何處理儲存裝置(單一檔案系統樹)。講解掛載(mounting)和卸載(unmounting)的概念,以及 /etc/fstab 檔案的作用。學習 mount 命令查看已掛載檔案系統,以及 unmount 命令卸載裝置,強調卸載的重要性(確保資料寫入緩衝區)。學習如何確定裝置名稱(/dev 目錄結構、tail /var/log/messages 技術)。學習建立新的檔案系統:fdisk 操縱分割區表、mkfs 建立檔案系統。學習測試和修復檔案系統(fsck)。介紹 dd 命令直接複製裝置資料。介紹建立光碟(CD-ROM)映像檔(genisoimage)和燒錄映像檔(wodim),以及直接掛載 ISO 映像檔。提及 md5sum 檢查檔案完整性。
- 網路 (Networking): 介紹 Linux 在網路應用中的廣泛性。學習檢查和監視網路狀態的命令:ping(測試連通性)、traceroute(追蹤路徑)、ip(顯示/操作網路介面和路由表,取代 ifconfig)、netstat(顯示網路連接、路由表、介面統計)。學習透過網路傳輸檔案的命令:ftp(傳統檔案傳輸,提及不安全)、lftp(更好的 FTP 用戶端)、wget(非互動式下載)。介紹安全通信:ssh(遠端安全登入,加密通信和主機認證)。講解 ssh 的基本使用、不同使用者登入、處理主機金鑰變更、遠端執行單一命令、以及 SSH 隧道(tunneling)的概念(如 X 轉發)。介紹基於 SSH 的安全檔案傳輸命令 scp 和 sftp。提及 Windows 的 SSH 客戶端 PuTTY。
- 搜尋檔案 (Searching for Files): 介紹 Linux 系統檔案眾多的背景。學習 locate 命令快速搜尋檔案(基於資料庫),介紹其工作原理和相關命令 updatedb。學習 find 命令在目錄階層中按各種屬性搜尋檔案(如類型、大小、修改時間、權限、所有者等)。講解 find 的語法(選項、測試、動作),介紹常用的測試和預定義動作(如 -print, -delete)。講解如何使用邏輯運算子(-a, -o, !, ( )) 組合測試條件。介紹使用者定義動作(-exec, -ok),以及如何提高效率(將結果傳給單個命令執行,例如結合 xargs 或使用 find 內建的 + 結束符號)。提醒處理包含特殊字元(如空格)的檔案名。透過建立「練習場」目錄,實際練習 find 命令。介紹 stat 命令查看檔案狀態。
- 歸檔與備份 (Archiving and Backup): 介紹資料壓縮(gzip, bzip2)和檔案歸檔(tar, zip)的概念及其用途。講解 gzip 和 gunzip 的使用(單個檔案、標準輸入/輸出、不同壓縮級別)。講解 bzip2 和 bunzip2(提供更高壓縮率)。強調不要重複壓縮。講解 tar 的使用(建立、列出內容、提取),強調其處理相對路徑和標準輸入/輸出的能力,以及與 gzip/bzip2 結合(-z, -j)和通過 ssh 進行網路傳輸的應用。講解 zip 和 unzip 的使用(與 Windows 互通),比較其與 tar 的異同。介紹 rsync 遠端檔案和目錄同步工具,強調其高效性(僅傳輸差異部分)和多種使用方式(本地複製、遠端複製 via ssh 或 rsync server)。透過實例展示 rsync 的應用。
- 文字處理 (Text Processing): 強調文字在 Linux 中的重要性(文件、網頁、郵件、程式原始碼等)。重溫 cat、sort、uniq 命令及其進階用法(cat -A 查看非列印字元、cat -n/-s、sort -n 數字排序、sort -k 欄位排序、sort -t 分隔符、uniq -c 計數)。學習 cut 按字元或欄位切割文本,介紹 expand 將 Tab 轉換為空格。學習 paste 合併多個檔案的行。學習 join 基於共享欄位連接兩個檔案的行。學習 comm 比較兩個已排序檔案的行。學習 diff 比較檔案差異,介紹預設、上下文 (-c) 和統一 (-u) 格式,以及 diff 文件(patch)。學習 patch 命令應用 diff 文件。介紹非互動式編輯工具:tr 轉換或刪除字元(如 DOS 到 Unix 轉換、ROT13 編碼)、sed 流編輯器(搜尋與替換 s 命令、列印 p 命令、刪除 d 命令、插入 i 命令、附加 a 命令、退出 q/Q 命令、地址、正則表達式、反向引用、腳本檔案)。簡要提及 awk 和 perl。介紹 aspell 互動式拼字檢查器及其不同模式(如 HTML)。
- 格式化輸出 (Formatting Output): 介紹用於格式化文字輸出的工具。學習 nl 為行編號,包括邏輯頁面概念。學習 fold 按指定長度折疊行。學習 fmt 簡單格式化文字(段落填充、連接行、處理縮排和前綴)。學習 pr 格式化文字用於列印(分頁、頁眉、頁腳、邊距、多欄),作為列印準備工具。學習 printf 格式化和列印資料(字符串、數字、浮點數、不同進位制、欄位寬度、精度、對齊),強調其在腳本中的應用。介紹文件格式化系統 groff(基於 troff),提及 mandoc 宏包用於生成 man 頁面,以及 tbl 用於格式化表格。簡要提及 TEX。
- 列印 (Printing): 介紹列印歷史(字元列印機 vs. 圖形列印機、PDL、PostScript)。介紹 Linux 列印系統 CUPS 和 Ghostscript。學習 pr 轉換文字檔案以供列印,及其控制頁面佈局的選項。學習發送列印作業:lpr(Berkeley 風格)和 lp(System V 風格),介紹常用選項(指定印表機、份數、頁面範圍、方向、縮放、邊距等)。介紹 a2ps 格式化檔案以供列印,強調其「Anything to PostScript」能力和預設的雙頁佈局。學習監控和控制列印作業:lpstat 顯示列印系統狀態、lpq 顯示印表機佇列狀態、lprm / cancel 取消列印作業。
-
第四部分:編寫 Shell 腳本 (Writing Shell Scripts)
- 編寫第一個腳本 (Writing Your First Script): 介紹 Shell 腳本的定義(包含命令的檔案)。講解如何編寫腳本:使用文字編輯器、設置檔案為可執行權限(chmod +x 或 755/700)、將腳本放置在 Shell 可以找到的位置(PATH 環境變數中的目錄,如 ~/bin 或 /usr/local/bin)。介紹腳本檔案格式(shebang #! 指定解釋器,註解 #)。演示簡單的「Hello World」腳本。講解提高腳本可讀性的技巧(使用長選項名、縮排、使用反斜線 \ 進行多行續行)。
- 啟動一個專案 (Starting a Project): 透過建立一個生成系統資訊報告的腳本專案,逐步引入腳本概念。第一階段:輸出一個最小的 HTML 文件。第二階段:在報告中加入一些系統資料。引入變數和常數(通常用大寫)的概念及其在 Shell 中的使用(無需聲明、直接賦值、參數擴展 $VARIABLE)。講解如何為變數賦值(包括命令替換)。介紹 Here Document (<< token) 和 Here String (<<< string) 語法,用於將多行文本嵌入到腳本中作為命令的標準輸入,比較其與 echo 的區別和用途(例如傳遞命令給 ftp)。
- 由上而下設計 (Top-Down Design): 介紹由上而下設計(Top-Down Design)的程式設計方法論(將複雜任務分解為簡單子任務)。介紹 Shell 函數的概念,它是嵌入在腳本中的「迷你腳本」,可作為獨立單元執行。學習 Shell 函數的兩種定義語法(function name {} 和 name () {})。介紹本地變數(local),其作用域僅限於定義它的函數內部,防止變數名衝突,提高函數的可移植性和重用性。講解如何保持腳本的可執行狀態(使用空函數或帶回饋的存根 stubs),以便在開發過程中盡早發現錯誤。
- 流程控制:分支 (if) (Flow Control: Branching with if): 介紹程式的分支概念(基於條件執行不同代碼)。講解 if 複合命令的語法(if commands; then commands; elif commands; else commands; fi)。解釋 if 如何根據命令的「退出狀態」(exit status) 決定執行哪個分支(0 表示成功,非 0 表示失敗)。介紹 test 命令(及其別名 [ ])用於執行各種條件測試(檔案測試 -e, -f, -d, -r, -w, -x 等;字串測試 = , !=, -z, -n, <, >;整數測試 -eq, -ne, -lt, -le, -gt, -ge)。講解 test 命令的語法和使用陷阱(如 > < 的引用問題)。介紹 bash 擴展的條件表達式 [[ ]] 和 (( )),它們提供了更現代、功能更豐富的測試方法([[ ]] 支持正則表達式 =~ 和檔案名模式匹配 ==;(( )) 專用於整數運算和比較)。講解如何使用邏輯運算子(&&, ||, !)組合表達式。介紹控制運算子 && 和 || 作為另一種簡潔的分支方式。透過實際例子解決腳本中根據使用者權限執行不同代碼的問題。
- 讀取鍵盤輸入 (Reading Keyboard Input): 介紹程式互動性,學習 read 命令從標準輸入讀取值。讲解 read 的基本用法(讀取單行,賦值給變數或預設的 REPLY 變數)。介紹 read 的各種選項(-p 指定提示符、-t 設定超時、-s 靜默模式、-a 讀取到陣列、-n 讀取指定字元數等)。講解 IFS(Internal Field Separator)變數如何控制 read 分隔輸入的欄位。解釋在管道中使用 read 的問題(由子 Shell 引起)以及如何使用 Here String (<<<) 或行程替換 (<(list)) 解決。強調輸入驗證的重要性(檢查空值、類型、格式)。介紹菜單驅動(menu-driven)程式設計概念,並演示如何使用 if 和 read 建立簡單菜單。
- 流程控制:迴圈 (while / until) (Flow Control: Looping with while / until): 介紹迴圈(Looping)的概念(重複執行一系列命令)。講解 while 複合命令的語法和用法,它在測試命令成功(退出狀態為 0)時重複執行迴圈體。演示如何使用 while 創建計數器和菜單循環。介紹 break 命令立即終止當前迴圈,continue 命令跳過當前迴圈剩餘部分並開始下一次迭代。講解 until 複合命令,它在測試命令失敗(退出狀態非 0)時重複執行迴圈體,直到測試命令成功。演示如何使用 while 或 until 從檔案讀取行並處理。
- 位置參數 (Positional Parameters): 介紹位置參數 ($0, $1, $2… ${10}…) 包含命令列上的單詞。$0 包含程式本身的名稱,$1… 包含參數。介紹 $# 參數包含命令列上的參數數量。學習 shift 命令將位置參數向左移動(丟棄 $1,原 $2 變為 $1),用於處理大量參數。演示使用位置參數編寫簡單應用程式(如檔案資訊程式)。講解如何在 Shell 函數中使用位置參數。介紹 $*, $@ 兩個特殊參數,用於一次處理所有位置參數,強調 “$@” 在大多數情況下是首選,因其保留各參數的完整性。將這些概念應用到報告生成腳本中,添加命令列選項處理。
- 字串與數字 (Strings and Numbers): 深入參數擴展,介紹處理空變數的擴展(${parameter:-word}, ${parameter:=word}, ${parameter:?word}, ${parameter:+word})。介紹返回變數名的擴展(${!prefix})。介紹字串操作擴展(${#parameter} 獲取長度、${parameter:offset:length} 提取子字串、${parameter#pattern} / ${parameter##pattern} 從開頭移除模式、${parameter%pattern} / ${parameter%%pattern} 從結尾移除模式、${parameter/pattern/string} 替換)。講解如何使用參數擴展進行大小寫轉換。深入算術擴展 $((expression)),介紹數字基數(二進制、八進制、十六進制)表示法、一元運算符、簡單算術運算符、賦值運算符(+=, -=, =, /=, %=)、自增/自減運算符 (++, –)。介紹位元運算符(~, <<, >>, &, |, ^)。介紹 (( )) 中的邏輯運算符(&&, ||, !)和比較運算符 (<, >, ==, !=, <=, >=)以及三元運算符 ?:。介紹 bc 命令作為任意精度計算語言,用於處理浮點數和複雜數學計算,講解其基本用法和腳本編寫。
- 其他精彩內容 (Exotica): 介紹一些不常用的 Shell 特性。講解群組命令 {} 和子 Shell () 的區別(環境繼承、執行速度)及其用於合併重導向和管道的功能。講解行程替換 <(list) / >(list),如何將子 Shell 的輸入/輸出視為檔案,解決管道中 read 的問題。介紹 Trap 捕捉信號(如 SIGINT, SIGTERM),用於在腳本異常終止時執行清理任務(如刪除臨時檔案)。介紹異步執行(將命令放入背景 &)以及 wait 命令等待指定的背景行程完成。介紹命名管道(named pipes / FIFO),一種特殊的檔案類型,用於在不相關的行程間進行通信。
-
-
總結:
- 重申精通命令列的價值,它提供了強大的工具和深入的系統理解。
- 鼓勵讀者持續實踐和探索更多命令。
這份詳盡的解釋覆蓋了書籍目錄中呈現的幾乎所有主要主題,按照書籍的結構組織,並對各個概念進行了展開說明,旨在滿足對文件主要論點進行詳盡解釋的要求。
comments
comments for this post are closed