Subject: C shell 變數之意義及其應用 X-Forwarded-By: guest (參觀用帳號) X-Disclaimer: ☆ 清華電機 BBS ☆ 對本信內容恕不負責。 Precedence: list Status: RO X-Status:    ┌─────────────────────────────┐    │  本文版權歸屬清華大學計算機與通訊中心林貞伶小姐    │    │  非經同意請勿任意轉載   jlin@cc.nthu.edu.tw    │    └─────────────────────────────┘ C SHELL變數之意義及其應用 SHELL,顧名思義,是包裝著UNIX作業系統核心的殼,它扮演一個命 令編譯者的角色,使用者乃透過它、間接地和UNIX系統的核心溝通, 而SHELL也就成為使用者在UNIX作業系統內工作時所直接感受到的環境。 因此,當您覺得UNIX"好用或不好用"、"方便或不方便",可能都和您所使 用的SHELL有著極密切的關聯。 對一般使用者接觸的比較多的DOS作業系統而言,它唯一的命令編譯 器是COMMAND.COM,使用者並沒有什麼選擇的機會;但在UNIX作業系統中, 使用者除了標準shell(sh)外,還有csh、tcsh、ksh、bash等不同的選 擇,這些不同的SHELL各有其處理命令的程序與方式,而為了保留使用者 使用時的彈性,以便於設定一最適合個人的環境,這些SHELL也都預留了 某些特定的變數,以做為使用者啟動、改變或關閉某些它特有的特定功能 的指標。這些能啟動或關閉某些特定功能的變數即是所謂的Shell Variable (sh中並無此類變數)。 在C Shell中我們可用'set'與'unset'指令來設定或取消某些變數及 其所代表的特定功能,以下我們就對C Shell常用的Shell Variable之意 義及功能做一簡單介紹: (一) Filename Completion的相關變數 1. filec 在設定此變數後(set filec),就啟動了csh中Filename Completion的功能。如此,只要我們在提示符號(如thccy5%)之 後輸入一個或數個字元、按鍵,csh便會在現行路徑下尋找 以這些字元為名稱開頭的目錄或檔案、並將未完成的部分自動填 上,如您想更換目錄到compress中,則只要下類似 cd co (按) 則csh在搜尋、補填後的指令將成為 cd compress 若以"co"為名稱開頭的檔案不止一個,則不做自動補填的動作, 並有一"嗶"的警告聲,此時可用CTRL-D令其列出所有以"co"為 檔名開頭的檔案及目錄。 很明顯的,這個功能可讓使用者省去一些輸入的動作,當 然也避免掉輸入長串檔名時可能發生的錯誤。 2. fignore 設定方式: set fignore = "[字串]" 如前述,在啟動了Filename Completion的情況下,若再加 上此一設定,那麼當您按鍵做檔名比對搜尋時,將跳過上 一{字串},如: set fignore = "compress" 則當您下 cd co 按補填檔名時,便不考慮compress這個檔案或目錄。 3. nobeep 如前述,當按鍵、而找到數個符合條件的檔名時,csh 會發出一"嗶"的警告聲,若set nobeep,則不會有此警告聲。 (二) Command History的相關變數 1. history csh可紀錄使用者自簽入到簽退之間所執行過的指令(不包含 無法執行的指令),並給予每一個紀錄下來的指令一個編號,使 用者可用"!n"(n為編號)代替原來的一長串命令。指令的編號可 以'history'指令(為csh的內鍵指令)查看,至於history將為使用者 紀錄、顯示多少個執行過的指令,則以 set history = n 加以設定(注意n越大、所使用的記憶體就越多)。 因history只紀錄可以執行的指令,因此使用"!n"執行某一 命令時,除了可節省敲鍵盤的時間外,也可以避免'敲錯鍵'情形 之發生。 2. histchars 如前述,"!"可用此變數設定而改用其他符號代替,如: set histchars = "#" 則"#1"即代替history紀錄中編號1的指令。 3. savehist 設定方式: set savehist = n (n為數字) 若您使用csh,則在您個人帳號下可能可以找到~/.history 這個檔案,而在~/.history中所記載的指令都將在使用者啟動csh 時即納入history的紀錄中,也就可以用"!n'的方式來使用這些 指令。 如果希望~/.history時時更新,可對savehist這個變數加以 設定(如前),則當使用者從某一帳號中簽退時,csh會把history 紀錄中的最後那n筆紀錄存到~/.history中,以供下次再簽入時 使用。要注意的是:若~/.history中的紀錄筆數過多或是n過大, 就可能會降低sh的啟動速度。 (三) 其餘常用變數 1. path 設定方式: set path = ([PATH1] [PATH2] ...) 設定指令尋找的路徑,這個SHELL變數的設定將可更新PATH 這個環境變數。要注意的是:csh不會自動在現行路徑下尋找 所要執行的執行檔,所以若希望它也能在現行路徑中尋找,必須 在設定時加入"."這個路徑,如 set path = (/bin /usr/local/bin .) 若希望先在現行路徑下尋找,請將"."移到括號內第一個位置。 2. prompt 可設定提示符號的形式,如 set prompt = "`pwd`% " 即是將提示符號定為pwd指令的執行結果再加上一"%"。 3. echo 設定方式: set echo 在這個設定下,csh會在執行指令前重覆一次這個指令,再 緊接著執行這個命令。若這個指令中包含了!(history substitution)、$(variable substitution)、*(filename substitution)或是指令本身即是一被設定好的alias時,csh都 會將它們依次解讀、一一顯示,再依序執行。這個設定的好處在 於:使用者能對解讀後的命令內容及每一個命令的執行結果都 一目瞭然。 4. verbose 設定方式: set verbose 這個設定與echo類似,但它僅將history substitution(!) 的解讀結果在執行命令前列出,不似set echo狀態下的詳細。 5. home 這個變數中存放了個人home directory的位置,設定方式為 set home = "[路徑位置,如/usr]" home變數設定的改變也會更新HOME這個環境變數的內容,而當 我們直行''cd'或'cd ~'指令,也都是參考這個變數所記載的路 徑來決定要更換到那一個目錄下,如 set home = "/" 則當執行cd或cd ~後,新的目錄位置將是/(root)。 6. ignoreeof 設定方式: set ignoreeof 在各種shell中,CTRL-d皆為一檔尾符號(EOF),它可結束在 畫面上一'等待輸入的狀態',如在畫面出現提示符號即表示shell 正等待使用者輸入指令,此時若鍵入CTRL-d就會結束這種等待狀 態、並因而結束這個shell的執行。 若啟動了ignoreeof,則是忽略CTRL-d的此種作用,亦即使 CTRL-d鍵失效。 7. noclobber 設定方式: set noclobber 在啟動了這個變數後,當使用者需做檔案轉向(>)即無法覆 蓋已存在的檔案,如執行'ls > filelist',其中的filelist若 是一已存在檔案,這個轉向動作就無法執行。 8. noglob 設定方式: set noglob 在這個設定下,csh將*等萬用字元視為一般字元,所以,如 果您發現您的帳號內有一名為*或r*之類的檔案,那麼我們可以 確定它們一定是在設定了noglob的情況下所建立,也一定要在設 定了noglob的情況下加以刪除(而不至波及其他檔案)。 9. nonomatch 設定方式: set nonomatch 我們經常會以萬用字元來尋找某一類型的資料,如執行 ls -l r* 或 more r* 若找不到合乎條件的檔案,一般會出現'No match'的錯誤訊息, 而在加上這個設定後,則將出現 [形式(如r*)] not found 之訊息。 10. shell 記載一個帳號的login shell,但它的改變並不會使環境變數中的 SHELL變數跟著更動,也不會影響下次簽入時所使用的shell,設 定方式如 set shell = "/bin/csh" 在瞭解了C SHELL中各變數的意義及用法後,使用者便可針對自己的 需要設定自己的環境,也可進一步將想啟動或設定的變數一起列入~/.cshrc 或~/.login等start file中,而在簽入時即一併設定。 簽入後,使用者可用"set"指令查看自己的環境中變數設 定及啟動的情況,若暫時不需要已設定的某一變數,可用 unset [變數名稱] 取消設定或是再執行 set [變數名稱] = "[變數內容]" 覆蓋、改變之前的設定。 對任何東西而言,瞭解都是應用的開始,希望這篇對csh變數之介紹 能是您在UNIX系統中隨心所欲、創造環境的開始。