3.2.3 bash簡介

bash 這個系統殼可說是您在 Linux 底下無時無刻都會接觸到的好夥伴,說起來她的功能可不只是單純的幫您執行程式,Linux 底下這些系統殼的能力都很強,甚至還發展出一套獨特的程式語言呢!!真的要詳細說明 bash 的話,可以寫一本厚厚的書出來,事實上就有好幾本專門講系統殼使用的原文書呢。在這邊筆者只能對 bash 做一個簡介,幫助使用者善用這個工具,假如讀者用熟了下面這些功能,相信就可以體會,為什麼有這麼多 Un*x 使用者,認為用命令列 (command line) 下指令操作系統,遠比用圖形介面工具拉來拉去有效率多了。

1. 編輯指令

有時候會不小心打錯指令,相信這是大家都會遇到的情況,bash 提供了一個單行的編輯功能,使用者可以用左右方向鍵移動游標,用 [backspace] 或 [del] 刪除游標前一個字元來編輯打錯的指令,此外,[ctrl]-a 會把游標移到指令的最前面,用 [ctrl]-e 可以把游標移動到指令的最後面,非常方便。

用 [ctrl]-c 可以中斷目前在編輯的這行指令,跳到一行新的提示符號重新輸入,此外,在程式執行中,[ctrl]-c 還可以用來強行中斷程式的執行,回到提示符號。

2. 萬用字元

我們在處理檔案的時候常常會需要一次處理一群檔案,這時候就可以利用萬用字元的幫助,所謂的萬用字元就是由系統殼提供的一些特殊字元,循一定的規則可以用來匹配一個以上的檔名,用來一次處理一群檔案,基本的萬用字元有兩種,一種是星號 "*",星號可以匹配任何數量的任何字元,所以 "ls /etc/* "的意思就是列出 /etc/ 目錄下所有的檔案檔名, "ls /etc/p* "的意思就是列出 /etc/ 目錄底下所有以 p 開頭的檔案名稱,一行指令裡面並不限於使用一個星號,所以 "ls /etc/*conf* "的意思就是列出 /etc/ 底下所有檔名裡面有 "conf" 字串的檔案,使用者可以實際操作一下這幾個指令,看看跟預期的結果是否相同。

第二種基本的萬用字元是用方括弧包起來的字元,可以匹配方括弧裡面的任意字元,例如 "ls /etc/[pqr]*" 就會列出 /etc/ 目錄底下所有以 p、q、r 開頭的檔案,假如您打算放在方括弧裡面的字元是連續的,還可以用減號 '-' 來少打幾個字,例如 [A-Z] 就代表了 ABCD... 一直到 Z 的所有字元,"ls /etc/[A-Z]*" 就會列出在 /etc/ 目錄底下所有用大寫字母開頭的檔案,"ls /etc/[0-9]*" 則會列出檔名用阿拉伯數字開頭的檔案。

您下的指令裡面含有萬用字元的話,系統殼會先將這些萬用字元解譯成為檔案名稱再送給呼叫的指令 (程式) 去處裡,bash 認得的萬用字元並不只上面提到的這兩種,這邊只說明就不再詳細說明了,使用者能夠善用萬用字元的匹配的話,對於日常工作會有很大的幫助。

3. 自動補齊功能

有時候我們要下的指令很長,或者指令後面要給的檔名很長,這個時候只要按一個 [Tab] 鍵,bash 就會在可能的指令或檔名裡面找尋匹配的,找到的話就會自動幫您補齊,讀者可以在提示符號下面打”Xconf”再按個 [Tab],bash 是不是就幫您自動補齊,成為 “Xconfigurator”了?這個功能在有需要輸入很長的檔名時特別有用,讀者可以試試看在提示符號下面打 "ls /usr/doc/rpm" ,緊接著 m 後面按一下 [Tab],發生什麼事就請您親身試試囉 :)

假如有超過一個檔案符合您輸入的字串,按 [Tab] 鍵以後 bash 並不會幫您補齊,這個時候假如連續按兩下 [Tab],bash 會把所有符合的檔案列出來。使用者可以操作一下,在提示符號後面打 "setup "再緊跟著 p 後面按兩下 [Tab] 試試,是不是列出一堆以 "setup "開頭的指令了?善用自動補齊的功能可以讓您工作效率加倍,也可以少記很多指令,使用者一定要學起來喔。

4. bash 的歷史紀錄

bash 會把您過去輸入過的指令記憶起來,只要按方向鍵中的向上鍵就可以叫出前一個指令,再按一次向上鍵就可以叫出更前一個指令,依此類推,用向下鍵可以回到下個指令,所以用上、下鍵就可以選擇以前輸入過的指令,再配合編輯指令的功能就可以少打很多字,用熟了以後可以大幅的增加生產力喔。

5. 管線與輸出、入重導向

大家想一下,我們執行程式的方法是不是常常就是餵一些資料給程式,然後等著在螢幕上看到程式執行的結果?在 Un*x 系統裡面,使用者可以把給程式的輸入跟程式處理後的輸出想像成資料的流動,程式本身內部的工作方式我們是沒有興趣的,可以看成是一個黑盒子,原始的資料流過這個黑盒子之後就會變成我們想要的形式,就好像我們把葫蘿菠 (輸入) 丟到榨汁機 (程式) 裡面,然後就得到葫蘿菠汁 (輸出) 一樣。管線與輸出入重導向的用處就是把本來該輸出到螢幕的資料轉到其他的地方,轉到另一個程式去處裡的叫管線,轉到檔案裡面的叫輸出重導向,這些功能讓 Un*x 程式可以連接起來互相合作,可以說是 Un*x 最強大的功能設計。

管線的符號是 '|',它用來連接兩個指令,可以讓前一個指令的輸出作為下一個指令的輸入,例如 "ls /etc/ | more" 就會把 "ls /etc/" 的結果丟給 more 處理。"more" 是一個 Un*x 程式,它會把輸入的資料一頁一頁的顯示出來,所以 "ls /etc/ | more" 的結果就是把 /etc/ 底下的檔案一次一頁的顯示出來,管線可以不只一個,您愛把一行指令串多長都可以,例如下面這一行指令,讀者可以自己實驗看看結果如何:

ls /etc/ | tr a-z A-Z | more

輸出重導向有兩種,一種是破壞性的,用的是一個大於符號 ">",另一種是遞增性的,用的是兩個大於符號">>";這兩種重導向都可以用來將原本要顯示在螢幕上的輸出結果存到檔案裡面,假如指定的檔案不存在的話,會新建一個,兩者差異在於前者會破壞原先的檔案,把原有的檔案內容蓋過去,而後者會把輸出結果附在檔案後面,不會破壞原先的資料:

[platin@h2 platin]$ ls out
ls: out: No such file or directory
[platin@h2 platin]$
[platin@h2 platin]$ ls /etc/csh*
/etc/csh.cshrc
[platin@h2 platin]$ ls /etc/csh* > out
[platin@h2 platin]$ ls out
out
[platin@h2 platin]$ cat out
/etc/csh.cshrc
[platin@h2 platin]$ ls /etc/csh* >> out
[platin@h2 platin]$ cat out
/etc/csh.cshrc
/etc/csh.cshrc
[platin@h2 platin]$ ls /etc/csh* > out
[platin@h2 platin]$ cat out
/etc/csh.cshrc
[platin@h2 platin]$

"cat" 是用來顯示檔案的內容,上面這個例子可以看出,原來沒有 "out" 這個檔案,執行 "ls /etc/csh* > out" 以後,原本輸出到螢幕上的輸出不見了,而且新出現了一個 "out" 檔案,這個檔案的內容就是原先該出現在螢幕上的東西,用 ">>" 會把結果附在已存在的檔案後面,使 out 的內容變成兩行了,用">"則會把原來檔案蓋掉。

有輸出重導向,也有輸入重導向,小於符號"<"可以用來將一個檔案的內容當作一個程式的輸入,讓程式從一個檔案裡面去讀取本來該用手動輸入的資料。