bash!(一)

來源:互聯網
上載者:User

bash

前言
    本文譯自《Slackware Linux Unleashed》(第三版)一書的 bash 一章,但做了一些必要的刪節,並且有的地方根據實際情況作了較大的改動,必要的話請參考原文。對本文有任何問題的話請與我聯絡:con@nease.net 

簡介
    本文將較為詳細地介紹 Linux 下最常用的 shell,bash。bash(Bourne Again Shell) 是 Linux 的預設 shell,並被大多數使用者所使用,在本文中你將學會: 

    什麼是shell 


    Linux上最常見的shell 

    命令補齊(Command-line completion)和通配 

    命令記錄(Command history)和別名 

    重新導向和管道 

    改變提示符 

    進程式控制制(Job control) 

    如何使用者化配置你的bash shell 

    另外你還將看到一些最常用的bash命令和記憶體變數的用法,讀完本文後你將能更快和更有效地使用bash。 

Shells in a Nutshell
    什麼是shell?總之這個詞好象總是出現在 Linux 裡,但很多新使用者並不清楚它的明確的含義。本節將給出一個確切的解釋並說明為什麼在Linux中它顯得如此的重要。 

什麼是Shell?
      shell是你(使用者)和Linux(或者更準確的說,是你和Linux核心)之間的介面程式。你在提示符下輸入的每個命令都由shell先解釋然後傳給Linux核心。 
--------------------------------------------------------------------------------

注意: 如果你熟悉m$-dos,你將認出這很象DOS 使用者和 COMMAND.COM之間的關係。唯 
      一的區別是command.com 的功能遠不能和shell 相提並論。 

--------------------------------------------------------------------------------

     shell 是一個命令語言解譯器(command-language interpreter)。擁有自己內建的 shell 命令集。此外,shell也能被系統中其他有效Linux 公用程式和應用程式(utilities and application programs)所調用。 

    不論何時你鍵入一個命令,它都被Linux shell所解釋。一些命令,比如列印當前工作目錄命令(pwd),是包含在Linux bash內部的(就象DOS的內部命令)。其他命令,比如拷貝命令(cp)和移動命令(rm),是存在於檔案系統中某個目錄下的單獨的程式。而對使用者來 說,你不知道(或者可能不關心)一個命令是建立在shell內部還是一個單獨的程式。 

    附圖展 示了 shell 是如何執行命令解釋的,shell 首先檢查命令是否是內部命令,不是的話再檢查是否是一個應用程式,這裡的應用程式可以是Linux本身的公用程式,比如ls 和 rm,也可以是購買的商業程式,比如 xv,或者是公用軟體(public domain software),就象 ghostview。然後shell試著在搜尋路徑裡尋找這些應用程式。搜尋路徑是一個能找到可執行程式的目錄列表。如果你鍵入的命令不是一個內部命令並 且在路徑裡沒有找到這個可執行檔,將會顯示一條錯誤資訊。而如果命令被成功的找到的話,shell的內部命令或應用程式將被分解為系統調用並傳給 Linux核心。 

    shell的另一個重要特性是它自身就是一個解釋型的程式設計語言,shell 程式設計語言支援在進階語言裡所能見到的絕大多數程式控制結構,比如迴圈,函數,變數和數組。shell 程式設計語言很易學,並且一旦掌握後它將成為你的得力工具。任何在提示符下能鍵入的命令也能放到一個可執行檔shell程式裡,這意味著用shell語言能簡 單地重複執行某一任務。 

shell 如何啟動

    shell在你成功地登入進入系統後啟動,並始終作為你與系統核心的互動手段直至你退出系統。你系統上的每位使用者都有一個預設的shell。每個使用者的缺 省shell在系統裡的passwd檔案裡被指定,該檔案的路徑是/etc/passwd。passwd檔案裡還包含有其他東西:每個人的使用者ID號,一 個口令加密後的拷貝和使用者登入後立即執行的程式,(註:為了加強安全性,現在的系統一般都把加密的口令放在另一個檔案--shadow中,而passwd 中存放口令的部分以一個x字元代替)雖然沒有嚴格規定這個程式必須是某個Linux shell,但大多數情況下都如此。 
  

最常用的shell

    在Linux 和 UNIX系統裡可以使用多種不同的shell可以使用。最常用的幾種是 Bourne shell (sh), C shell (csh), 和 Korn shell (ksh)。三種shell 都有它們的優點和缺點。Bourne shell 的作者是 Steven Bourne。它是 UNIX 最初使用的shell 並且在每種 UNIX 上都可以使用。Bourne shell 在 shell 編程方面相當優秀,但在處理與使用者的互動方面作得不如其他幾種 shell。 

    C shell 由 Bill Joy 所寫,它更多的考慮了使用者介面的友好性。它支援象命令補齊(command-line completion)等一些 Bourne shell 所不支援的特性。普遍認為C shell 的編程介面做的不如 Bourne shell, 但 C shell 被很多 C  程式員使用因為 C shell的文法和 C語言的很相似,這也是C shell名稱的由來。 

    Korn shell (ksh) 由 Dave Korn 所寫。它集合了C shell 和 Bourne shell 的優點並且和 Bourne shell 完全相容。 

    除了這些 shell 以外,許多其他的 shell 程式吸收了這些原來的 shell 程式的優點而成為新的 shell 。在 Linux 上常見的有 tcsh (csh 的擴充),Bourne Again shell(bash, sh 的擴充), 和Public Domain Korn shell (pdksh, ksh 的擴充)。bash 是大多數Linux 系統的預設 shell。 

The Bourne Again Shell

  
  


    Bourne Again shell (bash), 正如它的名字所暗示的,是 Bourne shell 的擴充。bash 與 Bourne shell 完全向後相容,並且在 Bourne shell 的基礎上增加和增強了很多特性。bash 也包含了很多 C 和 Korn shell 裡的優點。bash 有很靈活和強大的編程介面,同時又有很友好的使用者介面。 

    為什麼要用 bash 來代替 sh 呢?Bourne shell 最大的缺點在於它處理使用者的輸入方面。在 Bourne shell 裡鍵入命令會很麻煩,尤其當你鍵入很多相似的命令時。而 bash 準備了幾種特性使命令的輸入變得更容易。 

命令補齊(Command-Line Completion)

    通常你在 bash (或任何其他的 shell)下輸入命令時你不必把命令輸全 shell 就能判斷出你所要輸入的命令。例如,假定當前的工作目錄包含以下的檔案和子目錄: 

News/ bin/ games/ mail/ samplefile test/ 
    如果你要進入 test 子目錄,你將會輸入以下的命令: 
cd test 
    這個命令能夠滿足你的需要,但 bash還提供了稍微不同的方法來完成同樣的事。因為 test 是目前的目錄裡唯一以字母 t開頭的子目錄,bash在你只輸入字母 t後就能判斷出你要做什麼了: 
cd t 
    在你鍵入那個字母后,唯一的可能就是 test 。想讓 bash 幫你結束命令的話,按下 Tab 鍵: 
  
cd t<tab>; 
    當你這樣做以後,bash 將幫你補齊命令並顯示在螢幕上。但在你按下斷行符號鍵以前命令並沒有被執行,bash 會讓你檢驗補齊的命令是否是你真正需要的。在輸入象這樣短的命令時你也許看不出它的價值所在,甚至在命令很短時還會簡慢輸入的速度,但是當你要輸入的命令 有點長時,你會發現這個特性是多麼的美好。 
    但是當目錄裡有不止一個以字母 t 開頭的檔案時會發生什麼情況呢?在你使用命令補齊時會有問題,讓我們看看下面的情況,目前的目錄裡有下列內容: 

News/  bin/   mail/  samplefile   test/  tools/ working/ 
    現在這個目錄裡有兩個以字母 t 開頭的檔案。假設你仍然想進入 test 子目錄,如何使用命令補齊呢?如果你象先前那樣鍵入: 
cd t<tab>; 
    bash 將不知道你到底想進入哪個子目錄,因為給出的資訊並不唯一。如果你這樣做了的話,bash 將發出一聲蜂鳴提醒你沒有足夠的資訊來補齊你的命令。蜂鳴之後bash 並不改變輸入的命令,這將使你能在原來的基礎上再輸入更多的資訊,在這個例子中你僅需再鍵入一個 e 並再按一下 Tab 鍵,這時 bash 就有足夠的資訊來完成你的命令了: 
cd test 
    當你輸入命令時不論何時按下 Tab 鍵,bash 都將盡其所能地試圖補齊命令,不行的話會發出蜂鳴來提醒你需要更多的資訊。你需要鍵入更多的字元,並再次按下 Tab 鍵,重複這個過程直至你期望的命令出現。 

萬用字元

    另一個使命令輸入變得更簡單的方法是在命令中使用萬用字元。bash 支援三種萬用字元:

[Copy to clipboard] [ - ]

CODE:*      匹配任何字元和任何數目的字元 

?      匹配任何單字元 

[...]  匹配任何包含在括弧裡的單字元


* 萬用字元的使用有些象命令補齊。例如,假設目前的目錄包含以下檔案: 

News/  bin/   games/   mail/  samplefile   test/ 

    如果你想進入 test 目錄,你將鍵入 cd test, 或者你想用命令補齊: 

cd t<tab>; 

    現在有第三種方法來做同樣的事。因為僅有一個檔案以字母 t 開頭,你也能用 * 萬用字元來進入該目錄。鍵入下列命令: 

cd t* 

    * 匹配任何字元和任何數目的字元,所以 shell 將把 t* 替換為 test(目前的目錄裡唯一和通配方案匹配的檔案)。目前的目錄裡只有一個檔案以字母 t 開頭的話這將是可靠的。但是如果目前的目錄裡有不止一個檔案以字母 t 開頭,shell 將試著進入第一個符合匹配方案的目錄,這個目錄是以字母表排序的第一個目錄,這個目錄也許是也許不是你所期望的。 

    萬用字元 * 的一個更實際的用途是通配你要執行的命令中的多個名字相似的檔案。例如,假設目前的目錄裡包含以下檔案: 

ch1.doc   ch2.doc   ch3.doc  chimp  config    mail/  test/  tools/ 

    如果你需要列印所有副檔名是 .doc 的檔案,你能使用象這樣簡化的命令: 

lpr *.doc 

    在這個例子中,bash 將把 *.doc 替換為目前的目錄下所有檔案名稱符合通配方案的檔案。在 bash 進行了替換後,該命令將被處理為: 

lpr ch1.doc ch2.doc ch3.doc 

    lpr 命令將以ch1.doc, ch2.doc, 和 ch3.doc為參數被調用。 



--------------------------------------------------------------------------------

    注意: 除了以上給出的例子外,還有幾種方法: 
           lpr *doc 
           lpr *oc 
           lpr *c 
--------------------------------------------------------------------------------

    萬用字元 ? 除了只能匹配單個字元外,其他功能都與萬用字元 *  相同,如果用萬用字元 ? 來列印前面提到的那個目錄裡所有副檔名是 .doc 的檔案的話,鍵入下面的命令: 

lpr ch?.doc 

    萬用字元[...]能匹配括弧中給出的字元或字元範圍。同樣以前面的目錄為例,列印那個目錄裡所有副檔名是 .doc 的檔案,你可以鍵入下列命令之一: 

lpr ch[123].doc 

或者: 

lpr ch[1-3].doc 

命令記錄
    bash 也支援命令記錄?%

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.