Ict-創新/LPI/103.1
考生應該能夠使用命令列與 Shell 和命令互動。目標假設使用 bash Shell。
關鍵知識領域
- 使用單個 Shell 命令和單行命令序列在命令列上執行基本任務。
- 使用和修改 Shell 環境,包括定義、引用和匯出環境變數。
- 使用和編輯命令歷史。
- 在定義的路徑內外呼叫命令。
與計算機系統互動的基本方法是使用命令列。Shell 解釋在鍵盤上輸入的指令。Shell 提示符(以 $ 或 # 結尾,表示使用者 root)表示它已準備好接收使用者輸入。
Shell 也是一個程式設計環境,可用於執行自動化任務。Shell 程式被稱為指令碼。
| Bourne Shell | /bin/sh |
| Bourne Again Shell | /bin/bash |
| Korn Shell | /bin/ksh |
| C Shell | /bin/csh |
| Tom's C Shell | /bin/tcsh |
由於 bash Shell 是 Linux 世界中最廣泛使用的 Shell 之一,因此 LPI 主要集中在這個 Shell 上。
Shell 命令通常採用以下形式
command [options] {arguments}.
bash Shell 使用 echo 命令將文字列印到螢幕上。
|
$ echo “this is a short line” |
完整路徑/相對路徑
Shell 將命令列上給出的任何字串的第一個“單詞”解釋為一個命令。如果字串是可執行檔案的完整路徑或相對路徑,則啟動可執行檔案。如果第一個單詞沒有“/”字元,則 Shell 將掃描 PATH 變數中定義的目錄,並嘗試執行與該字串匹配的第一個命令。
例如,如果 PATH 變數只包含目錄 /bin 和 /usr/bin,則命令 xeyes 將找不到,因為它儲存在 /usr/X11R6/bin/xeyes 中,因此需要使用完整路徑
|
$ /usr/X11R6/bin/xeyes |
另一種方法是使用相對路徑來輸入可執行檔案的完整路徑。例如,如果使用者在儲存 xeyes 程式的目錄中,則可以輸入
|
$ ./xeyes |
上面的命令中的“.”表示當前工作目錄。由於您已在當前目錄中,因此該命令也可以簡單地寫成:(只有當“.”在您的搜尋路徑中時)
|
$ xeyes |
Shell 變數類似於任何計算語言中使用的變數。變數名僅限於字母數字字元。例如 CREDIT=300 只是將值 300 分配給名為 CREDIT 的變數。
| 1. 初始化變數 | Variable-Name=value(沒有空格!!) |
| 2. 引用變數 | $Variable-Name |
|
CREDIT=300 echo $CREDIT |
可以使用 unset 命令刪除變數的值。
匯出、設定和 Env
變數有兩種型別:區域性變數和匯出變數。
區域性變數僅對當前 Shell 可訪問。另一方面,匯出變數可供 Shell 和從該 Shell 啟動的任何子程序訪問。
set 和 env 命令用於列出定義的變數
| set | 列出所有變數 |
| env | 列出所有匯出變數 |
全域性變數在任何子程序都可以引用它的意義上是全域性的。下面的示例匯出變數 credit,然後檢查它是否按預期匯出。
|
export CREDIT |
| env | grep CREDIT |
常見預定義變數列表
| DISPLAY | X 用於識別在哪裡執行客戶端應用程式 |
| HISTFILE | 使用者 .bash_history 檔案的路徑 |
| HOME | 使用者主目錄的路徑 |
| LOGNAME | 使用者用來登入的名稱 |
| PATH | Shell 在輸入命令時搜尋程式的目錄列表,這些命令沒有路徑。 |
| PWD | 當前工作目錄 |
| SHELL | 使用的 Shell(大多數 Linux 發行版中的 bash) |
| TERM | 當前終端模擬 |
特殊變數
接下來的幾個變數與程序管理相關。
|
$! 代表最後一個子程序的 PID 值 $$ 代表正在執行的 Shell 的 PID $? 如果上一個命令成功執行則為 0,否則為非零值 |
元字元和引號
元字元是 Shell 中具有特殊含義的字元。它們主要用於檔案通配,即使用最少的字母來匹配多個檔案或目錄名稱。輸入 (<)、輸出 (>) 和管道 (|) 字元也是特殊字元,以及用於變數的美元 ($) 符號。我們不會在此列出它們,但請注意,這些字元很少用於命名普通檔案。
- * 萬用字元可以替換任意數量的字元。
|
$ ls /usr/bin/b* |
列出所有以 'b' 開頭的程式
- ? 萬用字元可以替換任何一個字元。
|
$ ls /usr/bin/?b* |
列出所有第二個字母為 'b' 的程式
- [ ] 用於定義一個值的範圍。
|
$ ls a[0-9] $ ls [!Aa]* |
第一行列出所有以 'a' 開頭並在第二位有一個數字的檔案。
第二行列出所有不以 'a' 或 'A' 開頭的檔案
- {string1,string2} 雖然不是檔案命名萬用字元,但它可以用來生成具有共同詞幹的名稱列表。
|
$ mkdir {mon, tues, wednes} day |
引號和轉義程式碼
元字元的特殊含義可以透過跳脫字元來取消,跳脫字元也是元字元。
反斜槓 (\) 稱為跳脫字元,它取消了緊隨其後的字元的含義,迫使 Shell 按字面意思解釋它。
單引號 (' ') 取消除反斜槓以外的所有元字元的含義。
雙引號 (" ") 是最弱的引號,但會取消大多數包含字元的特殊含義,除了管道 (|)、反斜槓 (\) 和變數 ($var)。
反引號
反引號 `` 將執行封閉的命令並將其輸出替換回命令列。下面的示例使用 date 命令定義變數 TIME。
|
$ TIME="Today's date is `date +%a:%d:%b`” echo $TIME Today's date is Sun:15:Jul |
另一種執行命令的方法(類似於反引號)是使用 $()。這將執行封閉的命令並將其視為變數。
|
$ TIME=$(date) |
要檢視先前輸入命令的列表,可以使用 bash 內建命令 history。
|
$ history
|
這列出了所有快取的命令,以及儲存在 ~/.bash_history 中的命令。當用戶退出 Shell 時,快取的命令將儲存到 ~/.bash_history。
您可以使用鍵盤上的向上箭頭和向下箭頭來回憶命令。還有 emacs 鍵繫結,使您能夠執行甚至編輯這些行。
| Ctrl+P | 上一行(與向上箭頭相同) |
| Ctrl+n | 下一行(與向下箭頭相同) |
| Ctrl+b | 在行上向後退一個字元(與左箭頭相同) |
| Ctrl+f | 在行上向前移動一個字元(與右箭頭相同) |
| Ctrl+a | 移至行首(與<Home>相同) |
| Ctrl+e | 移至行尾(與<End>相同) |
感嘆號 (!) 鍵可用於重新執行命令。
示例
| x 執行歷史記錄列表中以 'x' 開頭的最新命令 | 2 執行歷史記錄輸出中的命令編號 2 | -2 執行倒數第二個命令 | ! 執行最後一個命令 ^string1^string2 執行上一個命令並將 string1 替換為 string2 |
|---|
其他命令
別名
您可以為需要多個引數的命令建立別名。建立別名的格式為
|
$ alias myprog='command [options]{arguments}' |
在命令列中僅鍵入 alias,您將獲得當前定義的別名列表。
命令補全
按Tab鍵,shell 將完成您開始鍵入的命令。
| command1; command2; command3 | 三個命令將依次執行,無論前一個命令是否成功 |
| command1 && command2 && command3 | 每個命令只有在先前的退出程式碼為 0(成功)時才會執行 |
| command1 || command2 || command3 | 下一個命令只有在先前的退出程式碼不為 0(失敗)時才會執行 |
exec 命令
此命令不是二進位制檔案,而是 shell 的一部分。它用於啟動其他命令。通常,如果執行一個命令,就會啟動一個子程序。如果使用 exec 命令啟動新程式,它將重新佔用用於啟動它的程序。它會替換當前 shell(在指令碼或互動式 shell 中)。
當新命令終止時,控制不會傳遞迴呼叫 shell,而是返回到呼叫用於執行 exec 呼叫的 shell 的程序。
|
$ echo $$ 414
$ echo $$ 455
hello $ echo $$ 455
hello $ echo $$ 414 |
上面的示例顯示了在直接的 echo 和使用 exec 的第一個 shell(程序 414)之後,控制返回到第二個 shell(程序 455)。
手冊頁和 whatis 資料庫
[edit | edit source]| NAME | 專案的名稱,後跟簡短的一行描述。 |
| SYNOPSYS | 命令的語法 |
| DESCRIPTION | 更詳細的描述 |
| OPTIONS | 所有可能的選項及其功能的概述 |
| FILES | 與當前專案相關的檔案(配置檔案等) |
| SEE ALSO | 與當前主題相關的其他手冊頁 |
這些是手冊頁中可以預期找到的主要主題部分。
whatis 資料庫儲存系統上所有手冊頁的 NAME 部分。它透過每天的 cron 定期更新。whatis 資料庫具有以下兩個條目
whatis 的語法為
whatis <string>
輸出是手冊頁的完整 NAME 部分,其中string 匹配named(key)
也可以使用 man 命令查詢 whatis 資料庫。語法為
man -k <string>
此命令類似於 apropos。與 whatis 不同,它將查詢資料庫的“名稱”和“一行描述”條目。如果字串與這些欄位中的任何一個單詞匹配,上述查詢將返回完整的NAME 部分。
示例:(匹配的字串已突出顯示)
|
whatis lilo |
| lilo (8) - install boot loader |
| lilo.conf [lilo] (5) - configuration file for lilo |
|
man -k lilo |
| grubby (8) - command line tool for configuring grub, lilo, and elilo |
| lilo (8) - install boot loader |
| lilo.conf [lilo] (5) - configuration file for lilo |
檔案系統層次結構標準,一種推薦的 Linux 檔案系統佈局,建議將手冊頁儲存在 /usr/share/man 中。但是,可以使用 /etc/man.config 中設定的 MANPATH 環境變數搜尋其他位置。每個目錄進一步劃分為子目錄,對應於手冊頁部分。
| 手冊頁部分 | |
|---|---|
| 第 1 部分 | 有關可執行檔案的資訊 |
| 第 2 部分 | 系統呼叫,例如 mkdir(2) |
| 第 3 部分 | 庫呼叫,例如 stdio(3) |
| 第 4 部分 | 裝置(/dev 中的檔案) |
| 第 5 部分 | 配置檔案和格式 |
| 第 6 部分 | 遊戲 |
| 第 7 部分 | 宏包 |
| 第 8 部分 | 管理命令 |
| 第 9 部分 | 核心例程 |
有時,具有相同名稱的手冊頁存在於多個部分中。
要訪問特定部分N,必須輸入
man N command
示例
| [[Image:]] $ man mkdir $ man 2 mkdir |
|---|
|
$ man crontab $ man 5 crontab |
file
file 用於嘗試檢測特定檔案的型別。
例如
|
$ file picture.png picture.png: PNG image, 179 x 179, 8-bit/color RGBA, non-interlaced |
該實用程式將識別命名不正確的檔案,因此,如果 picture.png 被命名為 readme.txt,則命令“file readme.txt”仍將識別該檔案為 png 檔案。
uname
uname 命令列印與核心版本、機器名稱、處理器型別和節點名稱相關的資訊。它最常用於識別機器執行的核心版本。
|
$ uname -r |
列印當前執行核心的版本號。
pwd
這是一個簡單地列印 shell 的當前工作目錄的命令。
使用的檔案、術語和實用程式:* bash
- echo
- env
- exec
- export
- pwd
- set
- unset
- man
- uname
- history