Bash 好用小技巧

Apr 16 2007

GNOME Terminal每天與 Linux 為伍,發現到,自己最常用到的軟體,除了商業軟體 Maya 與上網用的瀏覽器 Firefox ,可能就屬 gnome-terminal 與 bash 了。(可見,我不大使用 NautilusKonqueror 或是 pcmanfm 這類檔案總管 ^^;)平日用到終端機的地方很多,像是協助同仁把不正常的軟體關掉(ex, 我寫的 media player: PicMon 2.0)、改檔案或目錄的權限、拷貝檔案或是轉 dvd 等都是。

Terminal Emulator 使用的是 gnome-terminal,而 shell 則是使用 bash(Ubuntu 預設的 shell)

為了讓工作的內容更有效率,也為了滿足自己的好奇心,於是收集了一些網路上的小技巧,然後依自己的使用經驗,過濾出如下幾個非常實用的來:

快速使用手冊(help)

第一個要提的,是使用手冊。一般在 unix 下工作的人,在遇到不熟的指令時,就會祭出 man 或 info(這個現在比較少人在用了?),不過如果是 if, echo, alias 或 cd 等,這類 bash 內建的指令的話,你直接下 man echo 是不會有結果的,這時就得先行 man bash,然後再從裡頭找出你要的來,很麻煩。

現在可以透過 help $cmd ,此處的 $cmd 是 bash 內建的任一個指令,秀出這個 bash 內建的指令的快速使用說明。來做到快速查閱這件事。

如果想快速知道 bash 有哪些內建指令時,可以直接下 help 就行了:

大括號擴展(Brace Expansion)

輸入一串像 array 的東西,bash 會自動幫你展開!!最簡單的例子,是配合 echo 印出一些字串來:

$ echo fi_{one,two,red,blue}_sh  
fi_one_sh fi_two_sh fi_red_sh fi_blue_sh


$ cp /etc/httpd/conf/httpd.conf{,.bak}  
等同於 cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak

這個例子很特別,它的大括號裡的第一個字項是空字串。這個技巧非常好用,方便你在工作時,遇到參數里頭,後一個與前一個的參數只有些微的不一樣的情況。

$ mkdir prod/{anim,light,comp}  
等同於 mkdir prod/anim prod/light prod/comp  
適合系統管理員快速建立一堆目錄來


而且還可以巢狀的,如下:  
$ mkdir prod/{anim,light,comp}/{sq01,sq02}/{sc01,sc02,sc03,sc04}


又,{}還可以內嵌  
$ echo b{ar{d,n,k},ed}s  
bards barns barks beds

以下要在bash的3.0版本以後才有

{2..5}   →→→→→→  2 3 4 5  
{d..h}   →→→→→→  d e f g h

使用 Brace Expansion 要注意的地方是,大括號裡頭,每個子項是使用逗號陽隔開來的,而且不能有空格,不然結果會不對。如果你希望顯示出來的內容有空格的話,可以使用如下的方法:

$ echo {"one ","two ","red ","blue "}fish one fish two fish red fish blue fish

指令替換(Command Substitution)

當我們要把某一段指令的執行結果,傳給另一個指令時,會使用到 pipe,而當我們想讓某一段指令執行結果,當成另一個指令的參數的話,就會用到指令替換。

一般,我們都是用到 ` 這個符號在做指令替換。舉個例子,我先透過 find 這個指令找出所有 .cpp 的檔案,然後再使用 grep 找出這些檔案裏頭,包含 ooxx 這個變數的檔名來,作法如下:

$ grep -l ooxx `find . -name '*.cpp'`

現在要提的,是另一個作法:使用 $() 來代替 `,於是,剛剛的例子,寫起來就變成這樣:

$ grep -l ooxx $(find . -name '*.cpp')

使用 $() 來代替 ` 有兩個主要原因:

  • 一是 $() 可以遞迴,雖然 也行,但是必須使用 來處理,而 $() 不用。簡單來說,使用 $() 的遞迴表示比較容易使用。
  • 一是 $() 比較好識別,尤其當你的內容有使用了不只一次的指令替換時,更是明顯。

快速切換目錄

常常會發生,你要在兩個目錄之間切來切去工作的情況,現在,你可以使用 cd - 來做到這點。

善用 history

一般,不想反覆再打一次下過的指令時,會使用上下鍵來找出打過的指令,然後再執行。有時,也可以利用 history,得知某比指令的 history id,然後使用 !$id (這個的 $id 是指令的 history id)來執行。但是有時,你並不想要執行了 history 後,再慢慢找到你要打的指令的 history id,這時,你可以使用 ctrl-r。先執行 ctrl-r,再打個一兩個字,這時 bash 會幫你找出最匹對的指令出來,如果沒有找到,就再多按幾次 ctrl-r。

參考資料

comments powered by Disqus