640 likes | 823 Views
第 21 章. 使用者環境. 本章大綱. 21-1 Shell 簡介 21-2 Shell 的各種功能 21-3 Shell 下的特殊字元 21-4 Shell 的環境變數與設定 21-5 .project、.plan 和.forward 設定檔. 前言. Shell 的功能在於搭起使用者與作業系統間的溝通橋樑 , 提供基本的操作介面 , 讓使用者得以下達各種指令 , 操作系統 , 產生彼此間的互動關係 , 因此我們可將 shell 看成是一種使用者環境。. 21 - 1 Shell 簡介.
E N D
第 21 章 使用者環境
本章大綱 • 21-1 Shell 簡介 • 21-2 Shell 的各種功能 • 21-3 Shell 下的特殊字元 • 21-4 Shell 的環境變數與設定 • 21-5 .project、.plan 和.forward 設定檔
前言 • Shell 的功能在於搭起使用者與作業系統間的溝通橋樑, 提供基本的操作介面, 讓使用者得以下達各種指令, 操作系統, 產生彼此間的互動關係, 因此我們可將 shell 看成是一種使用者環境。
21 - 1 Shell 簡介 • Shell 的原意是外殼, 用來形成物體外部的架構, 使整體具有輪廓而不致鬆垮變形。對作業系統而言, shell 負責使用者和作業系統兩者之間的溝通, 把使用者下達的指令解譯給系統去執行, 並將系統傳回的訊息再次解譯, 讓使用者瞭解其含意。所以 shell 除了可視為使用者環境之外, 也稱為指令解譯器。
種類繁多的 Shell • 每一種作業系統都有其特定的 shell, 例如: • MS DOS 的標準 shell 是 command.com。 • Windows 的 shell 是 explorer.exe。 • Unix 之類的作業系統, 其使用的 shell 各有不同。常見的 shell 有 Small Bourne Shell (ash)、Bourne Again Shell (bash/bash2)、Bourne Shell (bsh)、BSD C Shell (csh)、Korn Shell (ksh)、Enhanced C Shell (tcsh) 和 ZShell (zsh) 等。
種類繁多的 Shell • Bourne Shell 是最早被廣泛使用與標準化的 shell, 幾乎所有的 Unix 相容家族都支援它。BSD C Shell 由 Berkeley 大學開發, 特點是易於使用且交談能力強。Enhanced C Shell 提供指令列編輯功能、補全功能, 以及拼字檢查功能。 • Bourne Again Shell 衍生自 Bourne Shell, 融入 BSD C Shell 的特色, 新增工作控制、別名 (alias)、指令歷程 (history) 等功能。
種類繁多的 Shell • 隨著 shell 程式版本不斷更新, 各種不同的 shell 相互截長補短, 彼此間的差異就逐漸減少。本 Linux 發行版預設的 shell 是 bash, 而且也支援 ash、 ksh、tcsh 和 zsh。
檢視與更換 Shell • 各種 Unix 相容家族預設使用的 shell 不盡相同, 例如 BSD 通常都使用 csh, Linux 都使用 bash。不過多半都會提供其他的 shell 讓使用者更換。在更換 shell 之前, 先讓我們認識提示符號並瞭解目前正在使用何種 shell。
指令提示符號 • Shell 各自擁有其指令提示符號, 一般是在使用者目前的目錄加上 $、%、# 或 > 符號。以 cassia 帳號為例:
指令提示符號 • 我們來看看在不同的 shell 之下, 其提示符號有何不同 (提示符號可自行設定, 此處以預設值為例): • ksh:$ • bash 和 bash2:[cassia@free ~]$ • zsh:[cassia@free]~ % • tcsh:[cassia@free ~]$ • 提示符號的用處是告訴使用者現在可以下達指令, 同時也表示先前下達的指令已經完成, 或是已經被放到背景執行。
檢視預設的 Shell 種類 • 要檢視登入系統時預設是用哪一種 shell, 最簡單的方式是執行 echo指令, 詢問系統 SHELL 環境變數的值:
檢視預設的 Shell 種類 • 另外, 執行 finger指令查詢使用者資料, 也能看出該使用者預設的 shell:
更換 Shell • 不同的 shell 有不一樣的特性, 有些時候使用者可能希望依自己的習慣使用別的 shell。最簡單的方法就是直接執行該 shell 之名稱。若要回到原來的 shell, 則執行 exit指令:
更換 Shell • 上述之方法僅能臨時改變環境, 一旦登出系統之後, 下次登入時又將變回預設的 shell。如果使用者希望更換預設值, 其步驟如下 (以 cassia 帳號為例):
更換 Shell • chsh指令的用法, 也可以簡寫如下: • 使用者必須先登出再重新登入系統, 就會啟用新指定的 shell 了。
禁止使用者登入 • 有些時候我們希望限制某位使用者僅能使用 FTP 或 E-mail 服務, 而不允許 telnet 或 ssh 登入。此時可將該使用者的 shell 換成 /sbin/nologin , 就能限定該使用者 (以 cas sia 為例) 不能 telnet 登入了。請以 root 帳號修改/etc/passwd 檔案:
21 - 2 Shell 的各種功能 • 每一種 shell 都會有些許的不同, 本 Linux 發行版的預設值是 bash, 接下來讓我們一同看看 bash 的特色。
指令歷程 • 當使用者在輸入指令的時候, 可利用一些基本按鍵幫助編修指令列: • [↑]:顯示上一個指令。 • [↓]:顯示下一個指令。 • [←]:游標向左移動。 • [→]游標向右移動。 • [Backspace]:向左刪除一個字元。
指令歷程 • 使用上下鍵, 不僅可切換此次登入後所執行過的指令, 還能夠記住使用者以前登入時所用過的指令。這些指令歷程都記錄在使用者家目錄裡的 .bash_history 檔案內。假設使用文書編輯器去開啟這個檔案, 會看到類似下列的內容:
指令歷程 • 執行 history指令可列出最近使用過的指令及其編號, 讓使用者免除反複輸入長串指令, 節省時間並減少錯誤發生:
指令歷程 • 除了直接指定編號之外, 也能根據 "減法" 原則執行指令:
指令歷程 • 但是如果只輸入 ! 或 !-0指令, 會出現語法錯誤和未知事件的訊息:
定義指令別名 • 別名的作用可讓使用者自訂新的指令名稱來替代原有的指令。範例如下:
定義指令別名 • 從上面範例中我們可清楚地看出, mycopy指令在經過定義之後, 成為 cp指令的別名。每當執行 mycopy指令就等於是執行 cp指令。我們可以透過 alias指令, 採用熟悉的字彙替指令設定別名, 讓 Linux 的指令名稱可依我們的喜好來更改。
定義指令別名 • 欲得知目前有多少指令被設了別名, 可執行 alias指令, 參考一下別名的定義方法:
定義指令別名 • 可以定義別名, 當然也能取消, 請看下面用 unalias指令取消別名的範例: • 在指令列下所定義的別名只是暫時性的, 當登出系統之後, 再次登入時所有輸入的別名指令都會消失。若希望每次登入時系統會自動設定別名, 請將 alias指令加入該帳號家目錄下的 .bashrc 檔案裡:
定義指令別名 • 您也許會感到有些疑惑?原本在 .bashrc 檔案中沒有定義所有的別名, 但執行 alias 指令還是列出一堆已經定義好的別名。其實這是因為系統已經預先設好一些較常用的別名, 供所有的人使用。而這些已設好的別名並不會定義在每個使用者的 .bashrc 檔中, 而是分別放在 /etc/profile.d 目錄內的 *.sh 設定檔中。
定義指令別名 • 若欲改變這些別名的定義, 請用文書編輯器開啟家目錄下的 .bashrc 檔案, 依自己的習慣將別名加入即可。系統讀取的順序是先讀 /etc/profile.d 內的 *.sh 檔案, 然後讀使用者的 .bashrc 檔案。若兩者定義的內容互有衝突, 則以後者為準。
指令補全 • 指令補全的功能可幫助使用者完成尚未全部輸入的指令, 範例如下:
指令補全 • 假使輸入資料不足, 導致 bash 無法判斷可能的指令為何, 系統便會發出聲響提醒使用者, 倘若此時再按一次 [Tab] 鍵, bash 就會把所有可能的指令都列出來, 供使用者參考:
實務經驗談 • 善用指令補全的功能, 可以幫助我們更快速、更正確地輸入指令, 例如:
工作控制 • 工作控制可在前景和背景間切換作業, 並且顯示有哪些工作正在背景中執行。所用的指令及其意義如下: • bg:將中斷的工作放到背景裡面去執行。 • fg:將正在背景執行的工作切回到前景來進行。 • jobs:顯示目前正在背景執行的工作名單。
工作控制 • 光是說說不易瞭解, 實際操作最能體會, 請您先切換到 root 帳號, 再操作以下範例:
工作控制 • 接著我們把正在執行的工作中斷, 放到背景裡面執行:
21 - 3 Shell 下的特殊字元 • Shell 下有些特殊字元, 可補系統指令之不足。常用的特殊字元及其意義條列於下: • #:標示註解, 這些說明不會被當成指令或程式執行。在 /etc/zshrc 檔案裡便能見到:
21 - 3 Shell 下的特殊字元 • &:以背景方式執行。例如執行updatedb & 指令, 會把這個工作丟到背景去執行。 • ':單引號定義引號內為一個完整的字串, 並且讓 shell 不要解讀其中的空白或特殊字元。例如執行 mycopy='cp -v'指令, 設定 mycopy為 cp -v指令的別名。 • *:對應任何字串、字元或空字串。例如執行 ls a*指令, 會列出所有以英文字母 "a" 開頭的檔案及子目錄。
21 - 3 Shell 下的特殊字元 • ?:對應任何單一字元。例如執行 ls b?指令, 會列出檔名為 2 個字元, 且第 1 個字元為 "b", 第 2 個字元為任意字元的檔案。 • .:表示目前所在的目錄。例如執 ./exefile 指令, 可執行位於現在目錄下的 exefile 執行檔 (exefile 為執行檔的檔案名稱)。 • ..:表示上一層的目錄。例如執行 cd ..指令可切換到上一層目錄。
21 - 3 Shell 下的特殊字元 • ;:可用它將多個指令分隔開來, 讓指令依序執行。範例如下所示: • >:把執行結果輸入一個檔案中。若該檔案已經存在, 則原有內容會被刪除。範例如下:
21 - 3 Shell 下的特殊字元 • >>:把執行結果附加到一個已存在的檔案後面。範例如下: • \:脫逸符號 (escape), 解除特殊字元的含意。 • |:建立管線, 將前一個指令的執行結果輸入給下一個指令使用。 • ~:使用者登入後所在的目錄, 也就是使用者家目錄。
21 - 3 Shell 下的特殊字元 • [英文字母或數字]:對應括弧中任意範圍的字元。示範如下: • 也可以指定字母的範圍: • 也可以指定數字的範圍:
21 - 3 Shell 下的特殊字元 • [!英文字母或數字]:排除括弧中任意範圍的字元。和前面一個的用法相反, 比如執行 ls [!abc]*指令, 會顯示所有不以英文字母 "a"、 "b"、"c" 中任一字元為檔名開頭的檔案。 • {英文字母或數字}: 對應括弧中的任意字元。效果和之前的 [英文字母或數字] 類似, 但是字母或數字間要以逗號間隔開來, 例如 ls {a,b,c}*。
請謹慎使用 . 與 * • 例如在 /tmp 目錄想檢查隱藏檔案時, 會直覺地打 ls .*, 但是 “.*” 會讓 shell 解釋成 . 與 ..。所以此指令可引伸為ls .. 將會顯示上一層目錄, 也就是根目錄的列表。又例如執行 cp-R /root/.* /tmp/時, 除了複製 /root 目錄下所有檔案, 還能引伸成 cp -R /root/../* /tmp/,導致根目錄底下所有目錄與檔案也會被複製過來。因此當執行指令時, 務必小心 . 與 * 兩者的搭配使用。
21 - 4 Shell 的環境變數與設定 • Shell 本身有一組用來儲存系統資訊的變數, 稱為環境變數 (Environment Variables)。環境變數依據 shell 種類的不同, 會有不一樣的變數及設定方法。
顯示環境變數 • 不同的 shell 雖擁有不一樣的環境變數, 但彼此間的差異並不大。在 bash 下可用 set指令查詢環境變數 (tcsh 請用 setenv指令):
修改環境變數 • 在 Bourne Shell 家族中, 環境變數的設定方式如下: