1. 程式人生 > >The Linux Command Line 前 11 章內容摘錄

The Linux Command Line 前 11 章內容摘錄

摘自The Linux Command Line中文翻譯,主要供本人快速回顧,不太建議未閱讀過TLCL的朋友瀏覽本篇文章

graphical user interfaces make easy tasks easy, while command line interfaces make difficult tasks possible

圖形使用者介面讓簡單的任務更容易完成,而命令列介面使完成複雜的任務成為可能

表3-1: cd 快捷鍵
快捷鍵 執行結果
cd 更改工作目錄到你的家目錄。
cd - 更改工作目錄到先前的工作目錄。
cd ~user_name 更改工作目錄到使用者家目錄。例如, cd ~bob 會更改工作目錄到使用者“bob”的家目錄。

大多數命令使用的選項,是由一箇中劃線加上一個字元組成,例如,“-l”,但是許多命令,包括來自於 GNU 專案的命令,也支援長選項,長選項由兩個中劃線加上一個字組成。當然,許多命令也允許把多個短選項串在一起使用。下面這例子,ls 命令有兩個選項,“l” 選項產生長格式輸出,“t”選項按檔案修改時間的先後來排序。加上長選項 “--reverse”,則結果會以相反的順序輸出

表 4-1: ls 命令選項
選項 長選項 描述
-a --all 列出所有檔案,甚至包括檔名以圓點開頭的預設會被隱藏的隱藏檔案。
-d --directory 通常,如果指定了目錄名,ls 命令會列出這個目錄中的內容,而不是目錄本身。 把這個選項與 -l 選項結合使用,可以看到所指定目錄的詳細資訊,而不是目錄中的內容。
-F --classify 這個選項會在每個所列出的名字後面加上一個指示符。例如,如果名字是 目錄名,則會加上一個'/'字元。
-h --human-readable 當以長格式列出時,以人們可讀的格式,而不是以位元組數來顯示檔案的大小。
-l 以長格式顯示結果。
-r --reverse 以相反的順序來顯示結果。通常,ls 命令的輸出結果按照字母升序排列。
-S 命令輸出結果按照檔案大小來排序。
-t 按照修改時間來排序。

file filename 確定檔案型別

everything is a file. 一切皆檔案

表5-1: 萬用字元
萬用字元 意義
* 匹配任意多個字元(包括零個或一個)
? 匹配任意一個字元(不包括零個)
[characters] 匹配任意一個屬於字符集中的字元
[!characters] 匹配任意一個不是字符集中的字元
[[:class:]] 匹配任意一個屬於指定字元類中的字元
表5-2: 普遍使用的字元類
字元類 意義
[:alnum:] 匹配任意一個字母或數字
[:alpha:] 匹配任意一個字母
[:digit:] 匹配任意一個數字
[:lower:] 匹配任意一個小寫字母
[:upper:] 匹配任意一個大寫字母

mkdir directory…

注意表示法: 在描述一個命令時(如上所示),當有三個圓點跟在一個命令的引數後面,這意味著那個引數可以重複

表5-4: cp 選項
選項 意義
-a, --archive 複製檔案和目錄,以及它們的屬性,包括所有權和許可權。 通常,複本具有使用者所操作檔案的預設屬性。
-i, --interactive 在重寫已存在檔案之前,提示使用者確認。如果這個選項不指定, cp 命令會預設重寫檔案。
-r, --recursive 遞迴地複製目錄及目錄中的內容。當複製目錄時, 需要這個選項(或者-a 選項)。
-u, --update 當把檔案從一個目錄複製到另一個目錄時,僅複製 目標目錄中不存在的檔案,或者是檔案內容新於目標目錄中已經存在的檔案。
-v, --verbose 顯示翔實的命令操作資訊
表5-6: mv 選項
選項 意義
-i --interactive 在重寫一個已經存在的檔案之前,提示使用者確認資訊。 如果不指定這個選項,mv 命令會預設重寫檔案內容。
-u --update 當把檔案從一個目錄移動另一個目錄時,只是移動不存在的檔案, 或者檔案內容新於目標目錄相對應檔案的內容。
-v --verbose 當操作 mv 命令時,顯示翔實的操作資訊。
表5-8: rm 選項
選項 意義
-i, --interactive 在刪除已存在的檔案前,提示使用者確認資訊。 如果不指定這個選項,rm 會默默地刪除檔案
-r, --recursive 遞迴地刪除檔案,這意味著,如果要刪除一個目錄,而此目錄 又包含子目錄,那麼子目錄也會被刪除。要刪除一個目錄,必須指定這個選項。
-f, --force 忽視不存在的檔案,不顯示提示資訊。這選項覆蓋了“--interactive”選項。
-v, --verbose 在執行 rm 命令時,顯示翔實的操作資訊。

對於符號連結,有一點值得記住,執行的大多數檔案操作是針對連結的物件,而不是連結本身。而 rm 命令是個特例。當你刪除連結的時候,刪除連結本身,而不是連結的物件。

bash 有一個內建的幫助工具,可供每一個 shell 內建命令使用。輸入“help”,接著是 shell 內部命令名。例如:help cd

注意表示法: 出現在命令語法說明中的方括號,表示可選的專案。一個豎槓字元表示互斥選項。在上面 cd 命令的例子中:cd [-L|-P] [dir]

許多可執行程式支援一個 --help 選項,這個選項是顯示命令所支援的語法和選項說明。例如:mkdir --help

許多希望被命令列使用的可執行程式,提供了一個正式的文件,叫做手冊或手冊頁(man page)。一個特殊的叫做 man 的分頁程式,可用來瀏覽他們。它是這樣使用的:man program

表6-1: 手冊頁的組織形式
章節 內容
1 使用者命令
2 程式介面核心系統呼叫
3 C 庫函式程式介面
4 特殊檔案,比如說裝置結點和驅動程式
5 檔案格式
6 遊戲娛樂,如螢幕保護程式
7 其他方面
8 系統管理員命令

有時候,我們需要檢視參考手冊的特定章節,從而找到我們需要的資訊。如果我們要查詢一種檔案格式,而同時它也是一個命令名時,這種情況尤其正確:man 5 passwd

alias name=‘string’ 在命令"alias"之後,輸入“name”,緊接著(沒有空格)是一個等號,等號之後是一串用引號引起的字串,字串的內容要賦值給 name。我們定義了別名之後,這個命令別名可以使用在任何地方

如果我們需要清空一個檔案內容(或者建立一個新的空檔案),可以使用這樣的技巧:> empty.txt

shell 使用檔案描述符提供了一種表示法來重定向檔案。因為標準錯誤和檔案描述符2一樣,我們用這種表示法來重定向標準錯誤:ls -l /bin/usr 2> ls-error.txt

可能有這種情況,我們希望捕捉一個命令的所有輸出到一個檔案。為了完成這個,我們必須同時重定向標準輸出和標準錯誤。有兩種方法來完成任務。第一個,傳統的方法,在舊版本 shell 中也有效:ls -l /bin/usr > ls-output.txt 2>&1,使用這種方法,我們完成兩個重定向。首先重定向標準輸出到檔案 ls-output.txt,然後重定向檔案描述符2(標準錯誤)到檔案描述符1(標準輸出)使用表示法2>&1。

現在的 bash 版本提供了第二種方法,更精簡合理的方法來執行這種聯合的重定向。ls -l /bin/usr &> ls-output.txt

我們不想要一個命令的輸出結果,只想把它們扔掉。這種情況尤其適用於錯誤和狀態資訊。系統通過重定向輸出結果到一個叫做"/dev/null"的特殊檔案,為我們提供瞭解決問題的方法。這個檔案是系統裝置,叫做位儲存桶,它可以接受輸入,並且對輸入不做任何處理。為了隱瞞命令錯誤資訊,我們這樣做:ls -l /bin/usr 2> /dev/null

cat 經常被用來顯示簡短的文字檔案。因為 cat 可以接受不只一個檔案作為引數,所以它也可以用來把檔案連線在一起。比方說我們下載了一個大型檔案,這個檔案被分離成多個部分(USENET 中的多媒體檔案經常以這種方式分離),我們想把它們連起來。如果檔案命名為:movie.mpeg.001 movie.mpeg.002 … movie.mpeg.099,我們能用這個命令把它們連線起來:cat movie.mpeg.0* > movie.mpeg

wc(字計數)命令是用來顯示檔案所包含的行數、字數和位元組數。如果 wc 不帶命令列引數,它接受標準輸入。"-l"選項限制命令輸出只能報道行數。新增 wc 到管道線來統計資料,是個很便利的方法。

grep 有一些方便的選項:"-i"使得 grep 在執行搜尋時忽略大小寫(通常,搜尋是大小寫敏感的),"-v"選項會告訴 grep 只打印不匹配的行。

Linux 提供了一個叫做 tee 的命令,這個命令製造了一個"tee",安裝到我們的管道上。tee 程式從標準輸入讀入資料,並且同時複製資料到標準輸出(允許資料繼續隨著管道線流動)和一個或多個檔案。當在某個中間處理階段來捕捉一個管道線的內容時,這很有幫助。這裡,我們重複執行一個先前的例子,這次包含 tee 命令,在 grep 過濾管道線的內容之前,來捕捉整個目錄列表到檔案 ls.txt:ls /usr/bin | tee ls.txt | grep zip

(字元)展開 路徑名展開 波浪線展開 算術表示式展開 花括號展開 引數展開 命令替換

引用 雙引號 單引號 轉義字元

在算術表示式中空格並不重要,並且表示式可以巢狀。一對括號可以用來把多個子表示式括起來。例如,5的平方乘以3:$(($((5**2)) * 3)) == $(((5**2) * 3))

花括號展開模式可能包含一個開頭部分叫做報頭,一個結尾部分叫做附言。花括號表示式本身可能包含一個由逗號分開的字串列表,或者一個整數區間,或者單個的字元的區間。這種模式不能嵌入空白字元。echo Front-{A,B,C}-Back echo Number_{1…5} echo {Z…A} echo a{A{1,2},B{3,4}}b mkdir {2007…2009}-0{1…9} {2007…2009}-{10…12}

你可能注意到在其它展開型別中,如果你誤輸入一個模式,展開就不會發生。這時 echo 命令只簡單地顯示誤鍵入的模式。但在引數展開中,如果你拼寫錯了一個變數名,展開仍然會進行,只是展開的結果是一個空字串

命令替換允許我們把一個命令的輸出作為一個展開模式來使用:ls -l $(which cp) == ls -l `which cp`

雙引號。如果你把文字放在雙引號中,shell 使用的特殊字元,都失去它們的特殊含義,被當作普通字元來看待。有幾個例外: $,\ (反斜槓),和 `(倒引號)。這意味著單詞分割、路徑名展開、波浪線展開和花括號展開都將失效,然而引數展開、算術展開和命令替換仍然執行。使用雙引號,我們可以處理包含空格的檔名。ls -l “two words.txt”

事實上,單詞分割機制把換行符看作界定符,對命令替換產生了一個雖然微妙但有趣的影響。考慮下面的例子:echo $(cal) != echo “$(cal)”,在第一個例項中,沒有引用的命令替換導致命令列包含38個引數。在第二個例子中,命令列只有一個引數,引數中包括嵌入的空格和換行符。

如果需要禁止所有的展開,我們要使用單引號。 echo text ~/.txt {a,b} $(echo foo) $((2+2)) $USER echo "text ~/.txt {a,b} $(echo foo) $((2+2)) $USER" echo ‘text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER’ 正如我們所看到的,隨著引用程度加強,越來越多的展開被禁止。

有時候我們只想引用單個字元。我們可以在字元之前加上一個反斜槓,在這裡叫做轉義字元。經常在雙引號中使用轉義字元,來有選擇地阻止展開。

命令列最為珍視的目標之一就是懶惰;用最少的擊鍵次數來完成最多的工作。另一個目標是你的手指永遠不必離開鍵盤,永不觸控滑鼠。

表9-1: 游標移動命令
按鍵 行動
Ctrl-a 移動游標到行首。
Ctrl-e 移動游標到行尾。
Ctrl-f 游標前移一個字元;和右箭頭作用一樣。
Ctrl-b 游標後移一個字元;和左箭頭作用一樣。
Alt-f 游標前移一個字。
Alt-b 游標後移一個字。
Ctrl-l 清空螢幕,移動游標到左上角。clear 命令完成同樣的工作。
表9-2: 文字編輯命令
按鍵 行動
Ctrl-d 刪除游標位置的字元。
Ctrl-t 游標位置的字元和游標前面的字元互換位置。
Alt-t 游標位置的字和其前面的字互換位置。
Alt-l 把從游標位置到字尾的字元轉換成小寫字母。
Alt-u 把從游標位置到字尾的字元轉換成大寫字母。
表9-3: 剪下和貼上命令
按鍵 行動
Ctrl-k 剪下從游標位置到行尾的文字。
Ctrl-u 剪下從游標位置到行首的文字。
Alt-d 剪下從游標位置到詞尾的文字。
Alt-Backspace 剪下從游標位置到詞頭的文字。如果游標在一個單詞的開頭,剪下前一個單詞。
Ctrl-y 把剪下環中的文字貼上到游標位置。
表9-4: 自動補全命令
按鍵 行動
Alt-? 顯示可能的自動補全列表。在大多數系統中,你也可以完成這個通過按 兩次 tab 鍵,這會更容易些。
Alt-* 插入所有可能的自動補全。當你想要使用多個可能的匹配項時,這個很有幫助。

歷史命令展開 history | grep /usr/bin 88 ls -l /usr/bin > ls-output.txt !88

bash 也具有增量搜尋歷史列表的能力。意思是在字元輸入的同時,bash 會去搜索歷史列表(直接出結果,並高亮匹配的第一個字),每多輸入一個字元都會使搜尋結果更接近目標。輸入 Ctrl-r來啟動增量搜尋,接著輸入你要尋找的字。當你找到它以後,你可以敲入 Enter 來執行命令,或者輸入 Ctrl-j,從歷史列表中複製這一行到當前命令列。再次輸入 Ctrl-r,來找到下一個匹配項(歷史列表中向上移動)。輸入 Ctrl-g 或者 Ctrl-c,退出搜尋。

表9-6: 歷史展開命令
序列 行為
!! 重複最後一次執行的命令。可能按下上箭頭按鍵和 enter 鍵更容易些。
!number 重複歷史列表中第 number 行的命令。
!string 重複最近歷史列表中,以這個字串開頭的命令。
!?string 重複最近歷史列表中,包含這個字串的命令。
表10-1: 檔案型別
屬性 檔案型別
- 一個普通檔案
d 一個目錄
l 一個符號連結。注意對於符號連結檔案,剩餘的檔案屬性總是"rwxrwxrwx",而且都是 虛擬值。真正的檔案屬性是指符號連結所指向的檔案的屬性。
c 一個字元裝置檔案。這種檔案型別是指按照位元組流來處理資料的裝置。 比如說終端機或者調變解調器
b 一個塊裝置檔案。這種檔案型別是指按照資料塊來處理資料的裝置,例如一個硬碟或者 CD-ROM 盤。
表 10-2: 許可權屬性
屬性 檔案 目錄
r 允許開啟並讀取檔案內容。 允許列出目錄中的內容,前提是目錄必須設定了可執行屬性(x)。
w 允許寫入檔案內容或截斷檔案。但是不允許對檔案進行重新命名或刪除,重新命名或刪除是由目錄的屬性決定的。 允許在目錄下新建、刪除或重新命名檔案,前提是目錄必須設定了可執行屬性(x)。
x 允許將檔案作為程式來執行,使用指令碼語言編寫的程式必須設定為可讀才能被執行。 允許進入目錄,例如:cd directory 。

su 命令用來以另一個使用者的身份來啟動 shell。這個命令語法看起來像這樣:su [-[l]] [user]。如果包含"-l"選項,那麼會為指定使用者啟動一個需要登入的 shell。這意味著會載入此使用者的 shell 環境,並且工作目錄會更改到這個使用者的家目錄。這通常是我們所需要的。如果不指定使用者,那麼就假定是超級使用者。注意(不可思議地),選項"-l"可以縮寫為"-",這是經常用到的形式。啟動超級使用者的 shell,我們可以這樣做:su -

以這樣的方式使用 su 命令,也可以只執行單個命令,而不是啟動一個新的可互動的 shell:su -c ‘command’。使用這種模式,命令傳遞到一個新 shell 中執行。把命令用單引號引起來很重要,因為我們不想命令在我們的 shell 中展開,但需要在新 shell 中展開。

sudo 命令在很多方面都相似於 su 命令,但是 sudo 還有一些非常重要的功能。管理員能夠配置 sudo 命令,從而允許一個普通使用者以不同的身份(通常是超級使用者),通過一種非常可控的方式來執行命令。尤其是,只有一個使用者可以執行一個或多個特殊命令時,(更體現了 sudo 命令的方便性)。另一個重要差異是 sudo 命令不要求超級使用者的密碼。使用 sudo 命令時,使用者使用他/她自己的密碼來認證。

su 和 sudo 之間的一個重要區別是 sudo 不會重新啟動一個 shell,也不會載入另一個使用者的 shell 執行環境。這意味者命令不必用單引號引起來。注意通過指定各種各樣的選項,這種行為可以被推翻。

只要輸入 passwd 命令,就能更改你的密碼。如果你具有超級使用者許可權,你可以指定一個使用者名稱作為 passwd 命令的引數,這樣可以設定另一個使用者的密碼。

預設情況下,ps 不會顯示很多程序資訊,只是列出與當前終端會話相關的程序。使用這個 “x” 選項,可以看到我們所擁有的每個程序的資訊。

表11-1: 程序狀態
狀態 含義
R 執行中。這意味著,程序正在執行或準備執行。
S 正在睡眠。程序沒有執行,而是,正在等待一個事件, 比如說,一個按鍵或者網路分組。
D 不可中斷睡眠。程序正在等待 I/O,比方說,一個磁碟驅動器的 I/O。
T 已停止。 已經指示程序停止執行。稍後介紹更多。
Z 一個死程序或“殭屍”程序。這是一個已經終止的子程序,但是它的父程序還沒有清空它。 (父程序沒有把子程序從程序表中刪除)
< 一個高優先順序程序。這可能會授予一個程序更多重要的資源,給它更多的 CPU 時間。 程序的這種屬性叫做 niceness。具有高優先順序的程序據說是不好的(less nice), 因為它佔用了比較多的 CPU 時間,這樣就給其它程序留下很少時間。
N 低優先順序程序。 一個低優先順序程序(一個“nice”程序)只有當其它高優先順序程序被服務了之後,才會得到處理器時間。

另一個流行的選項組合是 “aux”(不帶開頭的"-"字元)。這會給我們更多資訊:

表11-2: BSD 風格的 ps 命令列標題
標題 含義
USER 使用者 ID。 程序的所有者。
%CPU 以百分比表示的 CPU 使用率
%MEM 以百分比表示的記憶體使用率
VSZ 虛擬記憶體大小
RSS 程序佔用的實體記憶體的大小,以千位元組為單位。
START 程序啟動的時間。若它的值超過24小時,則用天表示。

top 顯示結果由兩部分組成:最上面是系統概要,下面是程序列表,以 CPU 的使用率排序。h,顯示程式的幫助螢幕,q, 退出 top 程式。

表11-3: top 命令資訊欄位
行號 欄位 意義
1 top 程式名。
14:59:20 當前時間。
up 6:30 這是正常執行時間。它是計算機從上次啟動到現在所執行的時間。 在這個例子裡,系統已經運行了六個半小時。
2 users 有兩個使用者登入系統。
load average: 載入平均值是指,等待執行的程序數目,也就是說,處於可以執行狀態並共享 CPU 的程序個數。 這裡展示了三個數值,每個數值對應不同的時間段。第一個是最後60秒的平均值, 下一個是前5分鐘的平均值,最後一個是前15分鐘的平均值。若平均值低於1.0,則指示計算機 工作不忙碌。
2 Tasks: 總結了程序數目和這些程序的各種狀態。
3 Cpu(s): 這一行描述了 CPU 正在進行的活動的特性。
0.7%us 0.7% 的 CPU 被用於使用者程序。這意味著程序在核心之外。
1.0%sy 1.0%的 CPU 時間被用於系統(核心)程序。
0.0%ni 0.0%的 CPU 時間被用於"nice"(低優先順序)程序。
98.3%id 98.3%的 CPU 時間是空閒的。
0.0%wa 0.0%的 CPU 時間來等待 I/O。
4 Mem: 展示實體記憶體的使用情況。
5 Swap: 展示交換分割槽(虛擬記憶體)的使用情況。

命令列啟動程式,忘了在命令後加字元 “&”, 將一個程序從前臺移動到後臺也是很方便的。輸入 Ctrl-z,可以停止一個前臺程序。用 bg 命令把程式移到後臺。bg %1

表 11-4: 常用訊號
編號 名字 含義
1 HUP 掛起(Hangup)。這是美好往昔的殘留部分,那時候終端機通過電話線和調變解調器連線到 遠端的計算機。這個訊號被用來告訴程式,控制的終端機已經“結束通話”。 通過關閉一個終端會話,可以展示這個訊號的作用。在當前終端執行的前臺程式將會收到這個訊號並終止。

許多守護程序也使用這個訊號,來重新初始化。這意味著,當一個守護程序收到這個訊號後, 這個程序會重新啟動,並且重新讀取它的配置檔案。Apache 網路伺服器守護程序就是一個例子。

2 INT 中斷。實現和 Ctrl-c 一樣的功能,由終端傳送。通常,它會終止一個程式。
9 KILL 殺死。這個訊號很特別。儘管程式可能會選擇不同的方式來處理髮送給它的 訊號,其中也包含忽略訊號,但是 KILL 訊號從不被髮送到目標程式。而是核心立即終止 這個程序。當一個程序以這種方式終止的時候,它沒有機會去做些“清理”工作,或者是儲存工作。 因為這個原因,把 KILL 訊號看作最後一招,當其它終止訊號失敗後,再使用它。
15 TERM 終止。這是 kill 命令傳送的預設訊號。如果程式仍然“活著”,可以接受訊號,那麼 這個它會終止。
18 CONT 繼續。在一個停止訊號後,這個訊號會恢復程序的執行。
19 STOP 停止。這個訊號導致程序停止執行,而不是終止。像 KILL 訊號,它不被 傳送到目標程序,因此它不能被忽略。
表 11-5: 其它常用訊號
編號 名字 含義
3 QUIT 退出
11 SEGV 段錯誤(Segmentation Violation)。如果一個程式非法使用記憶體,就會發送這個訊號。也就是說, 程式試圖寫入記憶體,而這個記憶體空間是不允許此程式寫入的。
20 TSTP 終端停止(Terminal Stop)。當按下 Ctrl-z 組合鍵後,終端傳送這個訊號。不像 STOP 訊號, TSTP 訊號由目標程序接收,且可能被忽略。
28 WINCH 改變視窗大小(Window Change)。當改變視窗大小時,系統會發送這個訊號。 一些程式,像 top 和 less 程式會響應這個訊號,按照新視窗的尺寸,重新整理顯示的內容。