知道什麼是 Shell 之後,那麼我們來瞭解一下 Linux 使用的是哪一個 shell 呢?什麼!哪一個?難道說 shell 不就是『一個 shell 嗎?』哈哈!那可不!由於早年的 Unix 年代,發展者眾,所以由於 shell 依據發展者的不同就有許多的版本,例如常聽到的 Bourne SHell (sh) 、在 Sun 裡頭預設的 C SHell、 商業上常用的 K SHell、, 還有 TCSH 等等,每一種 Shell 都各有其特點。至於 Linux 使用的這一種版本就稱為『 Bourne Again SHell (簡稱 bash ) 』,這個 Shell 是 Bourne Shell 的增強版本,也是基準於 GNU 的架構下發展出來的呦!在介紹 shell 的優點之前,先來說一說 shell 的簡單歷史吧:第一個流行的 shell 是由 Steven Bourne 發展出來的,為了紀念他所以就稱為 Bourne shell ,或直接簡稱為 sh !而後來另一個廣為流傳的 shell 是由柏克萊大學的 Bill Joy 設計依附於 BSD 版的 Unix 系統中的 shell ,這個 shell 的語法有點類似 C 語言,所以才得名為 C shell ,簡稱為 csh !由於在學術界 Sun 主機勢力相當的龐大,而 Sun 主要是 BSD 的分支之一,所以 C shell 也是另一個很重要而且流傳很廣的 shell 之一(因為太多的程式設計師使用的就是 C 語言啦!)!
好了,那麼 BASH 是怎麼一回事呢?這個 shell 是 GNU 計畫中重要的工具軟體之一,目前也是 GNU 作業系統中標準的 shell ,他主要相容於 sh ,並且依據一些使用者需求,而加強的 shell 版本,可以說目前幾乎所有的 Linux distribution 都是使用 bash 作為管理核心的主要 shell !因此,不論您使用的是那個 distribution ,你都難逃需要學習 bash 的宿命啦!那麼這個 shell 有什麼好處,幹嘛 Linux 要使用他作為預設的 shell 呢? BASH 主要的優點有底下幾個:
- 命令編修能力(類似 DOS 的 doskey 功能):
使用 bash 裡頭,個人認為相當棒的一個功能就是『他能記憶使用過的指令!』這功能真的相當的棒!因為我只要在指令列按『上下鍵』就可以找到前一個輸入的指令!而在 Mandrake 9.0 預設的指令記憶功能可以到達 1000 個!也就是說,你曾經下達過的指令都被記錄下來了,記錄的檔案在你的家目錄內的 .bash_history !不過,需要留意的是, ~/.bash_history 記錄的是前一次登入以前所執行過的指令,而至於這一次登入所執行的指令都被暫存在暫記憶體中,當您成功的登出系統後,該指令記憶才會記錄到 .bash_history 當中!這有什麼功能呢?最大的好處就是可以『查詢曾經做過的舉動!』,如此可以知道你的執行步驟,那麼就可以追蹤您曾下達的指令,以作為除錯的工具!但如此一來也有個煩惱,就是如果被駭客入侵了,那麼他只要翻你曾經執行過的指令,剛好你的指令又跟系統有關(例如直接輸入 MySQL 的密碼在指令列上面)那麼很容易就被破解你的 Linux 主機!所以,最好是將記錄的指令數目減小一點較好!
- 檔案比對補全功能(比對資料正確性):
這個功能也相當的棒!主要分為指令補全與檔案名稱補全:
- 指令補全:如果在執行命令的時候不想按下太多的按鍵,例如指令 pcprofiledump 夠長吧!好了,那麼如果你輸入了 pcprofile 之後,再按下 [Tab] 按鍵的話,那麼 bash 馬上會自動的將後面的 dump 接上來!那如果有重複的指令呢?那麼按下兩次 [Tab] 將會把所有重複的指令給他列出來囉!那麼就有個特殊的案例啦,就是『直接在提示字元後面連按兩次 <tab> 鍵,則系統會將所有可以使用的指令都列出來!』那麼如果我想要知道目前系統裡面,所以 b 開頭的指令呢?呵呵!就是按下 b 之後,連按兩次 <tab> 就可以知道啦!
- 檔案名稱補全:此外,如果你用 vi 來讀取某個檔案時,例如 /etc/man.config 這個檔案好了,那麼您可以輸入 vi /etc/man. 之後,直接按下 <tab> 按鍵,那麼該檔案名稱就會被自動的補齊囉!呵呵!很方便,而且對於檔案名稱或者指令名稱的正確性上面,幫助還蠻大的吧!是的!真的是很方便的功能,所以,有事沒事,在 bash shell 底下,多按幾次 <tab> 是一個不錯的習慣啦!
- 命令別名(alias)設定功能:
假如我需要知道這個目錄底下的所有檔案(包含隱藏檔)及所有的檔案屬性,那麼我就必須要下達 ls -al 這樣的指令列,唉!真麻煩,有沒有更快的取代方式?呵呵!就使用命令別名呀!例如我最喜歡直接以 lm 這個自訂的命令來取代上面的命令,也就是說, lm 會等於 ls -al 這樣的一個功能,嘿!那麼要如何作呢?就使用 alias 即可!你可以在指令列輸入 alias 就可以知道目前的命令別名有哪些了!也可以直接下達命令來設定別名呦:alias lm='ls -al'
- 工作控制(jobs)、前景背景控制:
這部分我們在之後的資源管理章節中會再提及!使用前、背景的控制可以讓工作進行的更為順利!至於工作控制(jobs)的用途則更廣,可以讓我們隨時將工作丟到背景中執行!而不怕不小心使用了 [Ctrl] + C 來停掉該程序!真是好樣的!此外,也可以在單一登入的環境中,達到多工的目的呢!
- Shell scripts 的強大功能:
在 DOS 年代還記得將一堆指令寫在一起的所謂的『批次檔』吧?在 Linux 底下的 shell scripts 則發揮的更為強大的功能,可以將您日常生活當中常需要下達的連續指令寫成一個檔案,該檔案並且可以透過對談互動式的方式來進行主機的偵測工作!也可以藉由 shell 提供的環境變數及相關指令來進行設計,哇!整個設計下來幾乎就是一個小型的程式語言了!該 scripts 的功能真的是超乎我的想像之外!以前在 DOS 底下需要程式語言才能寫的東西,在 Linux 底下使用簡單的 shell scripts 就可以幫你達成了!真的利害!!這部分我們在後續章節再來談!
在瞭解了 BASH 的優點之後,再來我們要來討論的是:那如何在 Shell 提供的環境中下達指令呢?其實很簡單的,下達指令的方式為:很簡單吧!OK!那麼再來一個問題:『Shell 是什麼時候開始接管 Linux 主機的!?』我們在後面會再提到『開機流程』的介紹,這裡先跳過去,假設你的機器已經開機成功了,那麼主機便進入等待使用者 login 的狀態。當使用者輸入了帳號與密碼,並且順利的 pass 之後,經過了 shell 的環境變數檔案讀取功能,最後,使用者進入自己的『家目錄』之後,例如 root 的家目錄在 /root 底下,一般使用者的家目錄則在 /etc/passwd 這個檔案裡面規定,那麼主機就已經丟了一個程序稱為 bash 的給你操作囉!
[root@test /root]# command [-options] parameter1 parameter2 ...
指令 選項 參數(1) 參數(2)1. command 為指令的名稱,例如變換路徑的指令為 cd 等等;
2. 中刮號[]並不存在於實際的指令中,而加入參數設定時,通常為 - 號,有時候完整名稱會輸入 -- 符號;
3. parameter1 parameter2.. 為依附在 option 後面的參數,或者是 command 的參數;
4. command, -options, parameter1.. 這幾個咚咚中間以空格來區分,不論空幾格 shell 都視為一格;
5. 指令太長的時候,可以使用 \ 符號來跳脫 [Enter] 符號,使指令連續到下一行。clearcase/" target="_blank" >cc">實例:
[root@test /root]# ls -al /root <==以 ls 列出 /root 這個目錄中的隱藏檔與相關的屬性參數;
[root@test /root]# ./configure --prefix=/usr/local --with-tcp_wrappers \
> --with-pam <==這兩行實際上是同一行的指令,但是加上 \ 跳脫符號後,指令可以連續到下一行!
[root@test /root]# ls -al /root <==這個指令與第一個相同,空白字元不論幾個,僅視為一個來處理。