當我們登入 Linux 之後, 第一個接觸到的, 便是 Shell. 我們必須對它有點初步的認識才行.
一. Shell 簡介.
Linux 系統分成三個重要的部份
核心 Shell
工具程式
核心的部份相當低階, 操作者不易和它直接溝通, 因此, 必須要有一個友善的介面(interface), 使得操作時能更為方便, 這個介面便是 Shell.
換言之, Shell 就是一個居於核心和操作者之間的一層使用者介面. 那麼, 為何稱它為 Shell 呢? Shell 的本意是 \"殼\" 的意思呢!
沒錯, 在核心的外面, 包覆著一層外殼, 用來負責接收使用者輸入的指令, 然後將指令解譯成核心能夠了解的方式, 傳給核心去執行, 再將結果傳回至預設的輸出周邊. 如圖所示:
例如: 鍵入 ls -l
shell 給你以下回應:
擁
檔 有 案 檔
種 案 檔案大小 最近修改的
類 檔案權限 數 擁有人 組別 (byte單位)日期及時間 檔案名稱 drwxr-xr-x 14 root root 1024 Jul 21 21:31 . drwxr-xr-x 17 root root 1024 Apr 11 12:01 ..
drwxr-xr-x 8 82 82 1024 Feb 25 19:23 apache
-rw-r--r-- 1 root root 1335460 Feb 25 17:45 apache_1_3_4.tar.gz drwxr-xr-x 6 root root 1024 Aug 31 1998 ftp drwxr-xr-x 5 root root 1024 Aug 31 1998 httpd
drwx------ 2 james james 1024 Apr 23 06:47 james
drwxr-xr-x 2 root root 12288 Aug 31 1998 lost+found drwxr-xr-x 2 msql nobody 1024 Dec 28 1998 msql drwxr-xr-x 28 ols3 ols3 2048 Jul 19 21:38 ols3
drwxr-xr-x 3 1022 nobody 1024 Jan 25 23:40 ols3cgi drwxrwxr-x 3 perl ols3 1024 Feb 2 07:11 perl -rw------- 1 root root 2097152 Jul 21 18:39 quota.group -rw------- 1 root root 1278656 Jul 21 18:39 quota.user drwxrwxr-x 2 root nobody 1024 May 11 1998 samba drwxr-xr-x 3 apache nobody 1024 Feb 25 16:58 temp
drwxrwxr-x 2 webadm nobody 1024 Mar 14 16:34 webadm
其實不只是 Linux 有這一層 Shell, 其它作業系統也有.
比如 DOS 的 command.com, Windows 的 GUI(Graphical User Interface), Mac 的 GUI. Shell 按著表現的方式與讀取使用者輸入種類的不同, 可分為二大類:
Text base : 文字導向 Graph base: 圖型導向
所謂 \"讀取使用者輸入種類不同\" 是指: 讀取自鍵盤, 或讀取自滑鼠, 其它 serial input, 螢幕觸控等.
這樣說來, Shell 好像只是命令直譯器罷了?!
嗯, 這倒要按不同的 OS 所附給的 Shell 其功能和選擇性的自由度而定.
以 DOS 的 COMMAND.COM 而言, 它就是一個十足的命令直譯器, 除了一點點 batch 檔的能力之外, 它的功能並不多. Win 平台的 GUI, 則是一個圖型式的命令直譯器, 介面十分友善. 不過, 這二種 OS, 不能讓你自由而簡單地選擇 Shell.(以前 DOS 有 4dos 可選用) Linux 的 shell, 除了做為命令直譯器之外, 它也是一個不錯的程式語言, 是系統管理維護時的重要工具.
由於 Unix 家族, 對 Shell 的處理, 採獨立自由開放的方式, 因此, Shell 的種類相當地多, 更可以讓人自由地更換(chsh).
目前流行的 shell 有:
Bourne shell : sh C shell : csh
Korn shell: ksh (商業軟體) tcsh (free)
Bourne Again shell: bash (GNU)
Linux 的標準 shell 是採用 bash. 它也是我們要學習的主要對象.
二. Shell 的簡史
第一個重要的 shell 是 Bourne shell (如此命名是為了紀念此 shell 的發明者 Steven Bourne), 1979 年第一個流行的 Unix 版本 7 發行時, 開始使用 Bourne shell.
Bourne shell 的主檔名為 sh, 因此, 日後人們便以 sh 為 Bourne shell 的主要識別名稱. 雖然 Unix 上的 shell 有許多種, 但 Bourne shell 的地位至今仍然沒有改變. 許多 Unix 系統中仍然使用 sh 做為重要的管理工具. (它的工作從開機到關機, 幾乎無所不包)
第一個廣為流行使用的 shell 變種是 C shell. C shell 主要附在 BSD 版的 Unix 系統中. 它的作者是柏克萊大學的 Bill Joy. C shell 主要是因為其語法和 C 語言相類似, 因而得名. 這使得 Unix 系統的程式師, 在學習 C shell 時, 感到相當地方便容易.
以上這二種形成 shell 的二大主流, 後來的變種 shell 大都攫取這二種 shell 的優點. 比如 Korn, tcsh 及 bash.
Bash shell 是 GNU 計劃的重要工具軟體之一, 也是 GNU 作業系統中標準的 shell. Bash 相容於 sh, 因此, 許多早期開發出來的 Bourne shell 都可以繼續在 bash 中運作. 現在我們安裝好的 RedHat Linux 便是完全使用 Bash. (/bin/sh -> /bin/bash)
Bash 在 1988 年誕生, 最初的作者是 Brian Fox, Chet Ramey 於 1989 加入, 現在官方正式的維護者是 Chet Ramey, 他的工作便是持續不斷地增強 bash 的功能.
1995~1996 期間推出 bash 2.0 , 在這之前, 廣為使用的版本是 1.14.x, 它增加了許多新的功能, 以及更好的相容性.
當然, Bash 是完全免費的, 它是 Open Source 的一員, 原始碼全部開放.
二. Bash 的功能.
Bash 具有以下功能:
相容於 Bourne shell (sh)
包含有 C shell 以及 Korn shell 中最好的功能.
具命令列編修的能力(您記得以前 DOS 中的 doskey 嗎?) 工作控制(job control)的能力, 可控制前景及背景程式
具 shell 程式設計的能力, 可讓您自訂shell及設計程式, 管理系統.
三. 新版的 Bash 哪裡抓取?
若欲抓取新版的 bash, 可至 http://www.gnu.org 或其 mirror 站台.
中研院 FTP 也是不錯的選擇. ftp://ftp.sinica.edu.tw 或 ftp://linux.sinica.edu.tw
三. 開始使用 Bash
當你 login 進 Linux 主機時, 便開始和 bash 互動, 一直到你 logout 主機(下exit,logout,或按^D) 為止.
Bash 的提示符號為 $ (代表一般身份使用者), 當您具有 root 權限時, 提示符號則變為 #. 一旦出現提示符號時, 您便可以開始鍵入操作命令列(command line)了. 命令可分為二大類:
bash 內建的指令 程式
如果是 bash 內建的指令, 則由 bash shell 負責回應; 若是程式, 則 shell 會找出該程式, 然後將控制權交給核心, 由核心執行該程式, 執行完之後, 再將控制權交回給 shell.
怎麼知道那些指令是 bash 內建的, 那些是程式呢? 通常用 \"which 指令\若沒有任何回應, 表示是內建的指令(除非該指令錯誤、不存在, 或該程式不在預設的搜尋路徑之內), 範例如下: [ols3@ols3 /ols3]$ which echo [沒有回應, 表示是內建的指令] [ols3@ols3 /ols3]$ which ls /bin/ls
四. 命令列的格式.
命令列通常由好幾個字串組成, 中間用空白或 tab 鍵分開. 如下所示: command 命令 rm
options 選項 -rf
arguments(或稱為 parameters) 參數 /home/ols3
除了空白和 tab 鍵之外, 每一部份, 我們稱之為 token, 比如上面的例子中, 便有三個 token: rm, -rf, /home/ols3.
當鍵入此一命令列時, shell 首先將它分解成個別的 token, 然後判斷是內建的指令, 或是程式, 再按之前提過的方式去執行.
怎麼知道一個命令或程式, 它有那些選項和參數呢? 通常 man 一下該指令, 就可以得到了. 例如: man rm
另外, 多行指令也可以一下全部寫在同一命令列中, 只要中間用 ; 分開, 如: ls ; mkdir test ; clear
五. 現行目錄和自家目錄.
所謂現行目錄(current directory)是指: 你現在所處的位置, 又稱為工作目錄(working directory). 欲知現行目錄為何? 可下 pwd 指令便知.
所謂自家目錄(home directory)是指: 當初 root 為你建立帳號時, 所指定給你的一個私人專用的目錄, 也是你登入系統之後, 第一個進入的地方. 欲知自家目錄, 可用下列方式:
cd (然後直接按 Enter) cd ~ (~ 代表自家目錄) cat /etc/passwd | grep 您的帳號
cd ./myway (進入目前目錄下的 myway 目錄中) cd .. (回到上一層目錄) cd - (回到先前的目錄)
相關的技巧
六. 萬用字元.
如果命令列的參數中, 含有檔名, 那麼萬用字元(wildcards)可以帶來十分便利的操作. (不過若使用不當, 也是惡夢的開始)
如果各位以前有過 DOS 的操作經驗, 應該還記得 * 及 ? 所代表的意義吧?!
以下是 bash 中使用的萬用字元:
? * 代表任何單一字元(character) 代表任何字串 (注意: 0 個以上的字元, 例: *yes 將包含 yes 或 yes-or-not) 在中括號中的字元皆符合, 如: [a-z]代表所有的小寫字母 不在中括號中的字元皆符合, 如: [!0-9]代表非數字的字元皆符合 [字元組合] [!字元組合] 七. 輸入和輸出與重新導向.
當 Linux 系統完成開機之後, 預設上, 便開有三個檔案, 這三個檔案是做為輸入、輸出以及顯示錯誤之用的. 我們稱之為:
標準輸入: 通常是鍵盤, 檔案代碼為 0 標準輸出: 通常是螢幕, 檔案代碼為 1
標準錯誤: 通常標準輸出相同(也就是螢幕), 檔案代碼為 2
雖然系統已幫你設好了這三個檔案, 但我們仍然可以視需要, 適時地改變輸入,輸出,及錯誤這三者至不同的地方. 這種改變標準輸出入的動作, 我們稱之為 \"I/O 重新導向\" (I/O Redirection). 例如:
ls -la > myfile 就是將查詢的結果重新導向至 myfile 中(本來是應該出現在螢幕上的) cat myfile 便可以看見 ls -la 的結果.
cat < myfile > youfile 就是將 myfile 的內容拷貝給 youfile. > 代表將輸出轉向 < 代表將輸入轉向
另一個會將輸出入轉向的機制是 \"管線\" (Pipelines). 所謂的管線就是將一個程式的輸出當成另一個程式的輸入. 例如: cat /etc/passwd | grep ols3
上面這段指令的意思是說: 把 /etc/passwd 檔的內容顯示結果(即輸出) 丟給 grep 這個指令當作輸入值, 然後由 grep 從中找出包含關鍵字 ols3 的資料列.
八. 前景與背景工作.
Linux 是多人多工的作業系統, 這意謂 Linux 可以讓多人同時使用, 更可以同時執行許多程式.
一般而言, 你所執行的指令會一直握著控制權, 一直到程式結束為止, 我們稱為這樣的執行工作是在前景工作(foreground jobs), 如果, 執行指令時, 你仍然可以再做其它的事情, 那我們就稱它是在背景工作.
通常比較耗時間的工作, 我們會把它丟到背景去執行, 而這期間, 我們仍然可以和 shell 繼續溝通, 下達其它命令給 shell 去執行.
例如: 我們想從中研院的 FTP 伺服器下載某一個目錄中所有的檔案, 但又不想等它執行完畢(因為這樣耗時間,也很無聊), 可以用以下的方式來達成: ncftp -R ftp://linux.sinica.edu.tw/pub1/redhat/powertools & 其中 & 這個符號便是將命令列丟到背景去執行的指令.
如果您想離線之後, 仍然令系統繼續傳檔, 可以在前面再加一個 nohup 的指令, 如下: nohup ncftp -R ftp://linux.sinica.edu.tw/pub1/redhat/powertools & nohup 是 no hangup 即不掛斷之意.
八. 特殊字元及引號.
有許多字元, 對 shell 來說, 是具有特殊意義的. 詳列於下: 符號 ~ ` # $ & * ( ) \\ | [ ] { } ; ' 意義 自家目錄 命令取代 註解 變數取值 背景工作 萬用字元 子shell開始 子shell結束 使特殊字元恢復本意 管線 字元組合開始 字元組合結束 命令區塊開始 命令區塊結束 命令分隔號 單引號(不具變數置換的功能) \" < > / ? ! 雙引號(具置換的功能) 輸入轉向 輸出轉向 路徑分隔號 萬用字元 管線邏輯意義上的 NOT 九. 常用控制組合鍵.
我們在操作 Linux 時, 常會使用一些組合鍵來控制 shell 的活動. 詳列如下: 組合鍵 Ctrl - C Ctrl - \\ Ctrl - D Ctrl - Z Ctrl - M Ctrl - S Ctrl - Q Ctrl - U Ctrl - ? 意義 中止目前的命令 同上 輸入結束, 即 EOF 之意 (如使用 mail 信件結束時); 或 logout 登出 Linux 暫停目前的命令 相當按 Enter 暫停螢幕輸出 恢復螢幕輸出 將命令列整列刪除 刪除最後一個字元, 相當於按 Del 十. 指令練習.
指令 ls pwd which more less passwd man cat touch cd 選項或參數 意義 mkdir rmdir cp rm head tail wc grep ps
因篇幅问题不能全部显示,请点此查看更多更全内容