830 likes | 1.02k Views
第 17 章. 使用者環境. 本章提要. 17-1 Shell 簡介 17-2 檢視與更換 Shell 17-3 Shell 的各種功能 17-4 Shell 下的特殊字元 17-5 Shell 的環境變數與設定 17-6 .project 、 .plan 和 .forward 設定檔. 17-1 Shell 簡介.
E N D
第 17 章 使用者環境
本章提要 • 17-1 Shell 簡介 • 17-2 檢視與更換 Shell • 17-3 Shell 的各種功能 • 17-4 Shell 下的特殊字元 • 17-5 Shell 的環境變數與設定 • 17-6 .project、.plan 和.forward 設定檔
17-1 Shell 簡介 • Shell 的原意是外殼, 用來形成物體外部的架構, 使整體具有輪廓而不致鬆垮變形。對作業系統而言, shell 負責使用者和作業系統兩者之間的溝通, 把使用者下達的指令解譯給系統去執行, 並將系統傳回的訊息再次解譯, 讓使用者瞭解其含意。 • 所以 shell 除了可視作使用者環境之外, 也稱為指令解譯器。
Shell 簡介 • 每一種作業系統都有其特定的 shell, 例如: • MS DOS 的標準 shell 是 command.com。 • Windows 的 shell 是 explorer.exe。 • Unix 之類的作業系統, 其使用的 shell 各有不同。常見的 shell 有 Small BourneShell (ash)、Bourne Again Shell (bash/bash2)、Bourne Shell (bsh)、BSDC 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 相互截長補短, 彼此間的差異就逐漸減少。 • BSD 的全名是 Berkeley Software Distribution/Design。
17-2 檢視與更換 Shell • 各種 Unix 相容家族預設使用的 shell 不盡相同, 例如 BSD 通常都使用 csh,Linux 都使用 bash。不過無論使用何種 shell 多半都會提供其他的 shell 讓使用者更換。在更換 shell 之前, 先讓我們認識提示符號並瞭解目前正在使用何種shell。
檢視與更換 Shell • 指令提示符號 • 檢視預設的 Shell 種類 • 更換 Shell • 禁止使用者登入
指令提示符號 • Shell 各自擁有其指令提示符號, 一般是在使用者目前的目錄加上 $、%、# 或 > 符號。以 tony 帳號為例:
指令提示符號 • 我們來看看在不同的 shell 之下, 其提示符號有何不同 (提示符號可自行設定, 此處以預設值為例): • ash:$ • bash 和 bash2:[tony@free tony]$ 或[tony@free ~]$ • ksh:$ • tcsh:[tony@free ~]$ • zsh:[tony@free]~ %
指令提示符號 • 在本 Linux 發行版中, bsh、csh 、sh 等都是符號連結 (symbolic link), bsh 指向 ash, csh 指向 tcsh、sh 指向 bash 。 • 提示符號的用處是告訴使用者現在可以下達指令, 同時也表示先前下達的指令已經完成, 或是已經被放到背景執行。
檢視預設的 Shell 種類 • 要檢視登入系統時預設是用哪一種 shell, 最簡單的方式是執行 echo指令,詢問系統 SHELL 環境變數的值:
檢視預設的 Shell 種類 • 另外, 執行 finger指令查詢使用者資料, 也能看出該使用者預設的 shell:
更換 Shell • 不同的 shell 有不一樣的特性, 有些時候使用者可能希望依自己的習慣使用別的 shell。要更換最簡單的方法就是直接執行該 shell 之名稱, 若要回到原來的 shell, 則請執行 exit指令:
更換 Shell • 上述之方法僅能臨時改變環境, 一旦登出系統之後, 下次登入時又將變回預設的 shell。如果使用者希望更換預設值, 其步驟如下 (以 tony 帳號為例):
更換 Shell • chsh指令的用法, 也可以簡寫如下: • 使用者必須先登出再重新登入系統, 就會啟用新指定的 shell 了。
禁止使用者登入 • 有些時候我們希望限制某位使用者僅能使用 FTP 或 E-mail 服務, 而不允許 telnet 或 ssh 登入。 • 此時您可將該使用者的 shell 換成 /sbin/nologin , 就能限定該使用者 (以 tony 為例) 不能 telnet 登入了。 • 請以 root 帳號修改/etc/passwd 檔案:
禁止使用者登入 • 我們必須指定 /sbin/nologin 給該使用者, 若僅把 shell 刪除而不加上任何檔案, 則該使用者登入時, 系統會自動啟用 sh 為其預設之 shell。
17-3 Shell 的各種功能 • 17-3-1 指令歷程 • 17-3-2 定義指令別名 • 17-3-3 指令補全 • 17-3-4 連續執行指令 • 17-3-5 工作控制 • 17-3-6 拼字檢查
17-3-1 指令歷程 • 當使用者在輸入指令的時候, 可利用一些基本按鍵幫助編修指令列: • [↑]:顯示上一個指令。 • [↓]:顯示下一個指令。 • [←]:游標向左移動。 • [→]:游標向右移動。 • [Backspace] :向左刪除一個字元。
指令歷程 • 其中上下鍵提供的指令歷程功能, 不僅可以切換此次登入後所執行過的指令, 還能夠記住之前登入時所使用過的指令。其運作方式是將之前登入所執行過的指令記錄在使用者家目錄下的 .bash_history 檔中, 而本次登入所執行的指令則另外記錄在暫存記憶體, 待成功登出後, 再寫入 .bash_history 檔內。
指令歷程 • 不過無論是之前登入所執行的指令, 或此次登入所執行的指令, 都可以透過執行 history指令查得。 • 指令歷程功能除了可以幫助使用者快速輸入指令外, 更可以幫助使用者透過查詢曾執行過的指令進行除錯工作。
指令歷程 • 以下先來看看 .bash_history 檔的內容:
指令歷程 • 執行history指令則可以列出本次登入及之前登入所使用過的指令, 並會依序為各指令編號。透過 history指令以下列方式執行指令, 在需要輸入長串指令的狀況下, 除了可以節省時間, 更可以減少錯誤發生:
指令歷程 • 除了直接指定編號之外, 也能根據 "減法" 原則執行指令:
指令歷程 • 但是如果只輸入 ! 或 !-0 指令, 會出現語法錯誤和未知事件的訊息:
17-3-2 定義指令別名 • 別名的作用可讓使用者自訂新的指令名稱來替代原有的指令。範例如下:
定義指令別名 • 從上面範例中我們可清楚地看出, mycopy指令在經過定義之後, 成為 cp指令的別名。每當執行 mycopy指令就等於是執行 cp指令。我們可以透過 alias 指令, 採用熟悉的字彙替指令設定別名, 讓 Linux 的指令名稱可依我們的喜好來更改。 • 欲得知目前有多少指令被設了別名, 可執行 alias指令, 參考一下別名的定義方法:
定義指令別名 • 我們可以定義別名, 當然也能取消, 以下即為 unalias指令取消別名的範例: • 在指令列下所定義的別名只是暫時性的, 當登出系統之後, 再次登入時所有輸入的別名指令都會消失。若希望每次登入時系統會自動設定別名, 請將 alias 指令加入該帳號家目錄中的 .bashrc 檔案裡:
定義指令別名 • 您也許會感到有些疑惑?原本在 .bashrc 檔案中沒有定義所有的別名, 但執行 alias指令還是列出一堆已經定義好的別名。這是因為系統已經預先設好一些較常用的別名, 供所有的人使用。而這些已設好的別名並不會定義在每個使用者的 .bashrc 檔中, 而是分別放在 /etc/profile.d 目錄內的 *.sh 設定檔中。 • 在使用者家目錄下 .bashrc 檔定義的別名僅對該使用者有效。
定義指令別名 • 若欲改變這些別名的定義, 請用文書編輯器開啟家目錄下的 .bashrc 檔案,依自己的習慣將別名加入即可。系統讀取的順序是先讀 /etc/profile.d 內的 *.sh檔案, 然後讀使用者的 .bashrc 檔案。若兩者定義的內容互有衝突, 則以後者為準。 • /etc/profile.d 目錄內的 *.csh檔案是給 csh 與 tcsh 環境使用的設定檔。
17-3-3 指令補全 • 指令補全的功能可幫助使用者完成尚未全部輸入的指令, 範例如下:
指令補全 • 假使輸入資料不足, 導致 bash 無法判斷可能的指令為何, 系統便會發出聲響提醒使用者, 倘若此時再按一次 鍵, bash 就會把所有可能的指令都列出來, 供使用者參考:
17-3-4 連續執行指令 • 在 Linux 下, 如果要連續執行多個指令, 不需一個一個依序下達, 可以使用";" 號, 一次下達所有欲執行的指令。連續執行的好處在於, 當您需要執行的指令中, 有某些指令需要花費較多時間執行時, 可以不必等該指令執行完, 再到終端機前下達下一個指令, 可以直接告訴系統該指令執行完後, 接著執行下一個指令。
連續執行指令 • 如此, 可以省下不少精神和時間。例如在編譯程式時可以如此下達指令:
17-3-5 工作控制 • 工作控制可在前景和背景間切換作業, 並且顯示有哪些工作正在背景中執行。所用的指令及其意義如下: • bg:將中斷的工作放到背景執行。 • fg:將正在背景執行的工作切回到前景來進行。 • jobs:顯示目前正在背景執行的工作名單。
工作控制 • 光是說說不易瞭解, 實際操作最能體會:
工作控制 • 接著我們把正在執行的工作中斷, 放到背景裡面執行:
17-3-6 拼字檢查 • shell 的拼字檢查功能會檢查使用者輸入的指令和參數是否正確, 假若出現錯誤, 就顯示最接近的答案, 讓使用者決定如何處理:
拼字檢查 • 自動修正時所出現的四個英文字母, 其代表意義如下: • y (yes):表示以修正過的指令執行, 在上例中會執行 rmdir 指令。 • n (no):表示不要修正指令, 直接執行它, 在上例中會執行 rmdiz 指令。
拼字檢查 • e (edit):表示不要執行指令, 讓使用者重新修改, 在上例中會如下顯示: • a (abort):表示放棄執行該指令, 回到指令提示符號。 • 假如把 "set correct=cmd" 改成 "set correct=all", 則拼字檢查會對整個指令列進行修正。
17-4 Shell 下的特殊字元 • Shell 下有些特殊字元, 可補系統指令之不足。常用的特殊字元及其意義條列於下: • #:標示註解, 這些說明不會被當成指令或程式執行。在大多數設定檔中都會用到, 例如 /etc/zshrc 檔案裡便能見到:
Shell 下的特殊字元 • &:以背景方式執行。例如執行 find / -name data -print &指令, 會把這個工作丟到背景去執行。 • ':單引號定義引號內為一個完整的字串, 並且讓 shell 不要解讀其中的空白或特殊字元。例如執行 alias findscsi='find / -name SCSI -print &'指令, 設定findscsi為 find / -name SCSI -print &指令的別名。