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
圖形使用者介面讓簡單的任務更容易完成,而命令列介面使完成複雜的任務成為可能
快捷鍵 | 執行結果 |
---|---|
cd | 更改工作目錄到你的家目錄。 |
cd - | 更改工作目錄到先前的工作目錄。 |
cd ~user_name | 更改工作目錄到使用者家目錄。例如, cd ~bob 會更改工作目錄到使用者“bob”的家目錄。 |
大多數命令使用的選項,是由一箇中劃線加上一個字元組成,例如,“-l”,但是許多命令,包括來自於 GNU 專案的命令,也支援長選項,長選項由兩個中劃線加上一個字組成。當然,許多命令也允許把多個短選項串在一起使用。下面這例子,ls 命令有兩個選項,“l” 選項產生長格式輸出,“t”選項按檔案修改時間的先後來排序。加上長選項 “--reverse”,則結果會以相反的順序輸出
選項 | 長選項 | 描述 |
---|---|---|
-a | --all | 列出所有檔案,甚至包括檔名以圓點開頭的預設會被隱藏的隱藏檔案。 |
-d | --directory | 通常,如果指定了目錄名,ls 命令會列出這個目錄中的內容,而不是目錄本身。 把這個選項與 -l 選項結合使用,可以看到所指定目錄的詳細資訊,而不是目錄中的內容。 |
-F | --classify | 這個選項會在每個所列出的名字後面加上一個指示符。例如,如果名字是 目錄名,則會加上一個'/'字元。 |
-h | --human-readable | 當以長格式列出時,以人們可讀的格式,而不是以位元組數來顯示檔案的大小。 |
-l | 以長格式顯示結果。 | |
-r | --reverse | 以相反的順序來顯示結果。通常,ls 命令的輸出結果按照字母升序排列。 |
-S | 命令輸出結果按照檔案大小來排序。 | |
-t | 按照修改時間來排序。 |
file filename 確定檔案型別
everything is a file. 一切皆檔案
萬用字元 | 意義 |
---|---|
* | 匹配任意多個字元(包括零個或一個) |
? | 匹配任意一個字元(不包括零個) |
[characters] | 匹配任意一個屬於字符集中的字元 |
[!characters] | 匹配任意一個不是字符集中的字元 |
[[:class:]] | 匹配任意一個屬於指定字元類中的字元 |
字元類 | 意義 |
---|---|
[:alnum:] | 匹配任意一個字母或數字 |
[:alpha:] | 匹配任意一個字母 |
[:digit:] | 匹配任意一個數字 |
[:lower:] | 匹配任意一個小寫字母 |
[:upper:] | 匹配任意一個大寫字母 |
mkdir directory…
注意表示法: 在描述一個命令時(如上所示),當有三個圓點跟在一個命令的引數後面,這意味著那個引數可以重複
選項 | 意義 |
---|---|
-a, --archive | 複製檔案和目錄,以及它們的屬性,包括所有權和許可權。 通常,複本具有使用者所操作檔案的預設屬性。 |
-i, --interactive | 在重寫已存在檔案之前,提示使用者確認。如果這個選項不指定, cp 命令會預設重寫檔案。 |
-r, --recursive | 遞迴地複製目錄及目錄中的內容。當複製目錄時, 需要這個選項(或者-a 選項)。 |
-u, --update | 當把檔案從一個目錄複製到另一個目錄時,僅複製 目標目錄中不存在的檔案,或者是檔案內容新於目標目錄中已經存在的檔案。 |
-v, --verbose | 顯示翔實的命令操作資訊 |
選項 | 意義 |
---|---|
-i --interactive | 在重寫一個已經存在的檔案之前,提示使用者確認資訊。 如果不指定這個選項,mv 命令會預設重寫檔案內容。 |
-u --update | 當把檔案從一個目錄移動另一個目錄時,只是移動不存在的檔案, 或者檔案內容新於目標目錄相對應檔案的內容。 |
-v --verbose | 當操作 mv 命令時,顯示翔實的操作資訊。 |
選項 | 意義 |
---|---|
-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
章節 | 內容 |
---|---|
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’ 正如我們所看到的,隨著引用程度加強,越來越多的展開被禁止。
有時候我們只想引用單個字元。我們可以在字元之前加上一個反斜槓,在這裡叫做轉義字元。經常在雙引號中使用轉義字元,來有選擇地阻止展開。
命令列最為珍視的目標之一就是懶惰;用最少的擊鍵次數來完成最多的工作。另一個目標是你的手指永遠不必離開鍵盤,永不觸控滑鼠。
按鍵 | 行動 |
---|---|
Ctrl-a | 移動游標到行首。 |
Ctrl-e | 移動游標到行尾。 |
Ctrl-f | 游標前移一個字元;和右箭頭作用一樣。 |
Ctrl-b | 游標後移一個字元;和左箭頭作用一樣。 |
Alt-f | 游標前移一個字。 |
Alt-b | 游標後移一個字。 |
Ctrl-l | 清空螢幕,移動游標到左上角。clear 命令完成同樣的工作。 |
按鍵 | 行動 |
---|---|
Ctrl-d | 刪除游標位置的字元。 |
Ctrl-t | 游標位置的字元和游標前面的字元互換位置。 |
Alt-t | 游標位置的字和其前面的字互換位置。 |
Alt-l | 把從游標位置到字尾的字元轉換成小寫字母。 |
Alt-u | 把從游標位置到字尾的字元轉換成大寫字母。 |
按鍵 | 行動 |
---|---|
Ctrl-k | 剪下從游標位置到行尾的文字。 |
Ctrl-u | 剪下從游標位置到行首的文字。 |
Alt-d | 剪下從游標位置到詞尾的文字。 |
Alt-Backspace | 剪下從游標位置到詞頭的文字。如果游標在一個單詞的開頭,剪下前一個單詞。 |
Ctrl-y | 把剪下環中的文字貼上到游標位置。 |
按鍵 | 行動 |
---|---|
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,退出搜尋。
序列 | 行為 |
---|---|
!! | 重複最後一次執行的命令。可能按下上箭頭按鍵和 enter 鍵更容易些。 |
!number | 重複歷史列表中第 number 行的命令。 |
!string | 重複最近歷史列表中,以這個字串開頭的命令。 |
!?string | 重複最近歷史列表中,包含這個字串的命令。 |
屬性 | 檔案型別 |
---|---|
- | 一個普通檔案 |
d | 一個目錄 |
l | 一個符號連結。注意對於符號連結檔案,剩餘的檔案屬性總是"rwxrwxrwx",而且都是 虛擬值。真正的檔案屬性是指符號連結所指向的檔案的屬性。 |
c | 一個字元裝置檔案。這種檔案型別是指按照位元組流來處理資料的裝置。 比如說終端機或者調變解調器 |
b | 一個塊裝置檔案。這種檔案型別是指按照資料塊來處理資料的裝置,例如一個硬碟或者 CD-ROM 盤。 |
屬性 | 檔案 | 目錄 |
---|---|---|
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” 選項,可以看到我們所擁有的每個程序的資訊。
狀態 | 含義 |
---|---|
R | 執行中。這意味著,程序正在執行或準備執行。 |
S | 正在睡眠。程序沒有執行,而是,正在等待一個事件, 比如說,一個按鍵或者網路分組。 |
D | 不可中斷睡眠。程序正在等待 I/O,比方說,一個磁碟驅動器的 I/O。 |
T | 已停止。 已經指示程序停止執行。稍後介紹更多。 |
Z | 一個死程序或“殭屍”程序。這是一個已經終止的子程序,但是它的父程序還沒有清空它。 (父程序沒有把子程序從程序表中刪除) |
< | 一個高優先順序程序。這可能會授予一個程序更多重要的資源,給它更多的 CPU 時間。 程序的這種屬性叫做 niceness。具有高優先順序的程序據說是不好的(less nice), 因為它佔用了比較多的 CPU 時間,這樣就給其它程序留下很少時間。 |
N | 低優先順序程序。 一個低優先順序程序(一個“nice”程序)只有當其它高優先順序程序被服務了之後,才會得到處理器時間。 |
另一個流行的選項組合是 “aux”(不帶開頭的"-"字元)。這會給我們更多資訊:
標題 | 含義 |
---|---|
USER | 使用者 ID。 程序的所有者。 |
%CPU | 以百分比表示的 CPU 使用率 |
%MEM | 以百分比表示的記憶體使用率 |
VSZ | 虛擬記憶體大小 |
RSS | 程序佔用的實體記憶體的大小,以千位元組為單位。 |
START | 程序啟動的時間。若它的值超過24小時,則用天表示。 |
top 顯示結果由兩部分組成:最上面是系統概要,下面是程序列表,以 CPU 的使用率排序。h,顯示程式的幫助螢幕,q, 退出 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
編號 | 名字 | 含義 |
---|---|---|
1 | HUP | 掛起(Hangup)。這是美好往昔的殘留部分,那時候終端機通過電話線和調變解調器連線到
遠端的計算機。這個訊號被用來告訴程式,控制的終端機已經“結束通話”。
通過關閉一個終端會話,可以展示這個訊號的作用。在當前終端執行的前臺程式將會收到這個訊號並終止。
許多守護程序也使用這個訊號,來重新初始化。這意味著,當一個守護程序收到這個訊號後, 這個程序會重新啟動,並且重新讀取它的配置檔案。Apache 網路伺服器守護程序就是一個例子。 |
2 | INT | 中斷。實現和 Ctrl-c 一樣的功能,由終端傳送。通常,它會終止一個程式。 |
9 | KILL | 殺死。這個訊號很特別。儘管程式可能會選擇不同的方式來處理髮送給它的 訊號,其中也包含忽略訊號,但是 KILL 訊號從不被髮送到目標程式。而是核心立即終止 這個程序。當一個程序以這種方式終止的時候,它沒有機會去做些“清理”工作,或者是儲存工作。 因為這個原因,把 KILL 訊號看作最後一招,當其它終止訊號失敗後,再使用它。 |
15 | TERM | 終止。這是 kill 命令傳送的預設訊號。如果程式仍然“活著”,可以接受訊號,那麼 這個它會終止。 |
18 | CONT | 繼續。在一個停止訊號後,這個訊號會恢復程序的執行。 |
19 | STOP | 停止。這個訊號導致程序停止執行,而不是終止。像 KILL 訊號,它不被 傳送到目標程序,因此它不能被忽略。 |
編號 | 名字 | 含義 |
---|---|---|
3 | QUIT | 退出 |
11 | SEGV | 段錯誤(Segmentation Violation)。如果一個程式非法使用記憶體,就會發送這個訊號。也就是說, 程式試圖寫入記憶體,而這個記憶體空間是不允許此程式寫入的。 |
20 | TSTP | 終端停止(Terminal Stop)。當按下 Ctrl-z 組合鍵後,終端傳送這個訊號。不像 STOP 訊號, TSTP 訊號由目標程序接收,且可能被忽略。 |
28 | WINCH | 改變視窗大小(Window Change)。當改變視窗大小時,系統會發送這個訊號。 一些程式,像 top 和 less 程式會響應這個訊號,按照新視窗的尺寸,重新整理顯示的內容。 |