UNIX的環境設定 一、SHELL的功能及分類 SHELL是UNIX作業系統中的'命令編譯器'(Command Inter- preter),它基本上是一個常駐的執行程式,它在使用者一簽入 成功後就立即被載入(可在簽入後以ps指令看到),主要功能則 在於接受使用者的指令、尋找命令(即檔案)的所在並加以執行。 因此,SHELL的不同可能直接影響使用者輸入指令的方式、檔 案尋找的程序及速度等。 UNIX作業系統的SHELL大致可分為兩大系統,一是1970年代 前期由美國貝爾實驗室(BELL LAB)所發展的sh(Bourne Shell), 它是UNIX系統中的標準SHELL,此一系統後來又發展出ksh(Korne Shell)、bash(Bourne Again Shell)等功能更多的介面;另一系 統是美國柏克來大學(Berkekey)在1970年代後期所發展的csh(C Shell),和它屬於同一系統的有tcsh等。 無論上述的那一種shell,它的基本功能與作用都是相同的, 它們之間的不同處可能在於對同一動作處理程序上的不同(會影響 命令處理的速度)、所提供內鍵命令及變數的或多或寡等,其中內 部命令與變數的多寡直接影響到shell功能的多寡,是使用者在使 用時最容易直接感受到的。 在UNIX系統中,使用者可視自己的需要執行sh、ksh、bash、 csh或tcsh來代替原先使用的shell、改變正在使用的環境;也可 以用'chsh'指令、輸入想使用的shell的路徑及名稱(如/bin/csh, 在Y11-Y14機器上還需輸入個人使用者的密碼),改變以後每次 login時所使用的shell、使自己所使用的環境能最滿足自己使用 上的需要。 二、SHELL 的START FILES 不管你的login shell是那一種shell,每一個shell都有它 自己的start files,我們設定理想環境時所需使用的指令與設 定的變數,都可以寫在這些start files中,在login時先後加以 執行,這些start files的名稱分別是: SHELL START FILES ─── ────── sh /etc/profile $HOME/.profile bash /etc/profile $HOME/.profile(or $HOME/.bashrc) csh None $HOME/.cshrc & $HOME/.login tcsh None $HOME/.cshrc(or $HOME/.tcshrc) & $HOME/.login 如果這些檔案都存在,那麼它們的執行順序將是: 1. sh系列 /etc/profile --> $HOME/.profile 2. csh系列 $HOME/.cshrc --> $HOME/.login 在這些start files中,/etc下的profile是系統管理者為 大家設定的,一般使用者無法做任何更動,如果對系統管理者的 設定覺得不夠或不符需要,則可在個人帳號下的.profile、 .cshrc、.login增加或修正,尤其是對csh及tcsh的使用者而言, 因為在/etc下並沒有start files,所以也不會有系統管理者設定 好的環境可以使用,使用者就必須自行設定所需要的所有的變數 與指令,否則常會有寸步難行的感覺,最常見的如許多指令都 因找不到而不能用(因為沒有設path)、鍵無法使用 (因鍵的作用沒有定義)...等。 三、常見的需求與常用的指令 當我們在UNIX環境中工作,常會為了使自己使用時更方便而 產生某些需求,這些常見的需求及其設定方式如: 1. 希望鍵能有作用 在$HOME/.profile或$HOME/.cshrc中加上 stty erase "^H" 2. 希望在UNIX環境中能使用中文 在$HOME/.profile(sh系列)中加上 stty -istrip cs8 LC_CTYPE=ISO_8859_1 export LC_CTYPE 在$HOME/.cshrc(csh系列)中加上 stty -istrip cs8 setenv LC_CTYPE iso_8859_1 3. 希望能有像DOS系統中DOSKEY的功能 只要是使用bash及tcsh即具備此項功能。 4. 希望能使用工作站上的漢書編輯器(he) 在$HOME/.profile(sh系列)中加上 LANG=big5 export LANG 在$HOME/.cshrc(csh系列)中加上 setenv LANG big5 5. 希望提示符號能隨著路徑更動而改變 在sh及csh中並無法做到這個功能,而在bash及tcsh中 的設定則分別是: bash:在$HOME/.profile中加上 PS1='`PWD`> ' 或 PS1="\w> " tcsh:在$HOME/.cshrc中加上 set prompt='%~> ' 除了上面所提到針對特殊需要所做的設定之外,在做環境設 定時常用到的指令還有: 1. stty 設定對輸入(input)的定義與如何做輸出,這個指令的 參數極為眾多,我們可用 stty -a 看到所有的參數及其設定,在這些參數中,常用的有: istrip (-istrip) 將所有的輸入截取成7 bits的資料,然而中文的資 料都是8 bits的,所以當需要使用中文時,請加上 '-istrip'這個參數,以避免輸入的資料被破壞。 cs7 cs8 設定每一字元的資料都是7 bits或8 bits的資料, 因此在需要使用中文時,通常會有如下的設定: stty -istrip cs8 iuclc (-iuclc) 將標準輸入的大寫字母視為小寫(或取消)。 olcuc (-olcuc) 將小寫的字母以大寫型態輸出(或取消)。 echo (-echo) 將所有的輸入由標準輸出處輸出(或取消輸出,即 在螢幕上看不到自己的輸入)。 stty除了這些參數外,還可以用來定義某一個鍵的特定 功能,如: stty erase "^H" stty kill "^U" 2. mesg y (mesg n) 若在工作時不希望被talk等訊息所打擾,可下'mesg n' 指令,以避免外來迅息中斷正要進行的工作('mesg y'則是 恢復與外界的溝通)。 3. umask [nnn] 設定新增檔案或目錄的屬性(mode),新檔案或新目錄的 mode為系統管理者以create所設定的屬性減去nnn,如系統管 理者所設定的檔案權利狀態是777,而使用者又自行設定了 umask 022 則這個使用者在他個人帳號下的每一個新產生的檔案的權利 狀態都將會是755(777-022)。 4. Function 與 Alias 對於一連串或某一指令,我們可以用function的方式 (在sh、ksh、bash中)或alias指令(在csh、tcsh、ksh、bash 中),用一簡短字串來代替這一個或一連串的指令,function 的用法如: vi(){ mesg n /usr/ucb/vi $* mesg y } 其中,'vi'是function的名稱,{}之間是'vi'這個 function所包含的指令內容,而要注意的是:function的名 稱不能與shell的內鍵指令(builtin)名稱相同,否則這個 function即無法成立。 同樣的功能,alias指令的用法如: alias vi 'mesg n; /usr/ucb/vi \!*; mesg y' 其中vi即是''中所包含字串的別名,別名與各shell的builtin 名稱可以一樣(alias本身也是一個內鍵指令)。 若我們在某一shell中同時建立一名稱相同的function 與alias(如在bash中),則alias的執行次序優先於function 的執行。 四、常用變數設定 在UNIX環境中的變數可分為兩類,一是環境變數(Enviroment Variable)、一是shell變數(Shell Variable),二者之間的不同 處在於:環境變數不會因為shell間的更替而失去這個變數的作 用,如PATH是一個環境變數,因此,即使您在設定好PATH之後再 執行另一個shell(如原來是用sh、而後在sh環境中再執行csh), PATH這個環境變數仍能繼續作用,而shell變數(如csh的cwd)則是 只有在特定的shell下才有作用,一執行其他shell就失去作用。 在sh及csh二系列各有其不同的設定變數的方式,為: 1. Bourne Shell系列 [VAR]=[STRING or NUMBER] export [VAR] 如果當我們離開shell、進入另一個程式(如tin)之後, 仍需要使用這個變數,則除了設定這個變數的值外,還需要 以'export'指令加以宣告,如設定螢幕型態的變數TERM就需 以'export'來宣告。 2. C Shell系列 set [var] = [STRING or NUMBER] setenv [var] [STRING or NUMBER] 其中'set'是單純設定變數值,'setenv'則除了設定變 數值外,還包含了類似sh中'export'的功能。 而無論是Bourne Shell或C Shell,它們都有一些基本的、 共同的常用變數,如: 1. PATH 設定執行檔的尋找路徑,若現行目錄也要包含在尋找的 路徑中,則需在設定路徑時給予一'.',表示現行目錄亦包含 在尋找的路徑中,如: PATH=.:/bin:/usr/local/bin:/usr/ucb 或 set path=(. /bin /usr/local/bin /usr/ucb) 2. EDITOR 設定想要使用的編輯器,如 EDITOR=/usr/ucb/vi 或 setenv EDITOR /usr/ucb/vi 3. HOME 設定個人帳號home directory的所在位置,通常在login 時即參考/etc/passwd而給予一設定值,因此除非使用者有某 些特殊需求,通常不會重新設定。 4. SHELL 同樣是在login時即會參考/etc/passwd的內容而自動設 定,使用者即使重新設定這個變數的內容,對帳號的使用也 不會有任何影響。 5. 提示符號的設定 在sh 中: PS1="[STRING]" PS2="[STRING]" 在csh中: set prompt="[STRING]" 當然以上所列的只是使用得較為廣泛的變數,若您覺得這些 不夠用,可用man sh、man csh、man tcsh、man bash指令查閱各 shell的說明,在其中您將可看到各個shell所包含的變數及各變數 的用法。 若不清楚某一變數的設定內容,可用'echo $[VAR]'來觀察 變數的內容,如: echo $PATH 五、SHELL 環境的異動 前面所提到start files中的設定將在使用者login時執行, 但當我們要在線上直接改變所使用的shell(如直接執行'csh'或 'exec csh',此時不會執行start files)或是要改變設定的內容, 在編修了start files或script files之後,可利用下列指令將 環境更新,而不必重新login: . [script file] (在sh 系列的shell中) source [script files] (在csh系列的shell中) 直接執行一個script file與用'.'、'source'指令執行各有 其不同的效果,我們可建立一內容為 cd / (或cd [DIR]) 的script file來觀察它們之間的差異: 因script file的執行環境是一內定或自定的subshell(可在 script file的第一行用類似'#!/bin/csh'指令加以設定), 所以它的直接執行並無法真正將shell環境的工作目錄切換到 /,而script file一結束,subshell即不存在、'cd /'指 令的效果也告消失;而用'.'或'source'執行則是真正將 shell的工作環境下的工作目錄更換到/,不會因為script file的結束而使檔案中指令的效果消失。 ========================================================================== UNIX 簡介 登錄工作站 ========== ..透過 PC 登錄工作站 =================== 執行格式:telnet hostname (在 dos 下執行) telnet ip-address Example: telnet doc telnet 140.122.77.120 目前系上可用的工作站如下: sun1 sun2 sun6 sun7 sun8 sun9 sun10 sun11 sun12 sun13 snow pacific atlantic indian graph1 doc happy grumpy sneezy bashfule dopey ice 註: 可利用指令 arp hostname 或 arp domain_name 查詢 ip_address ..登錄步驟 ========= login : _______ => 輸入 username password : _______ => 輸入密碼 ..登出步驟 ========= % logout 或 % exit 或 % 更改帳號密碼 ============ % yppasswd => 執行後將會出現下列訊息 Changing NIS password for user on ice. Old password: ______ => 輸入舊密碼 New password: ______ => 輸入新密碼(最好6-8字,英文字母與數字混合) Retype new password: ______ => 再輸入一次密碼 線上指令說明 ============ 執行格式: man command-name Example: % man ls 進入遠端電腦系統 ================ 執行格式:rlogin hostname [-1 username] Example: %rlogin doc remote login 進入工作站 doc 中。 %rlogin doc -l user 使用 user 帳號進入工作站 doc 中。 執行格式:telnet hostname 或 telnet IP address Example: %telnet doc or %telnet 140.109.20.251 檔案或目錄處理 ================== .列出檔案或目錄下之檔案名稱 執行格式: ls [-atFlgR] [name] ( name 可為檔名或目錄名稱。) Example : ls 列出目前目錄下之檔名。 ls -a 列出包含以.起始的隱藏檔所有檔名。 ls -t 依照檔案最後修改時間之順序,依序列出檔名。 ls -F 列出目前目錄下之檔名及其類型。"/" 結尾表示為目錄名稱, "*" 結尾表示為執行檔,"@" 結尾表示為 symblic link。 ls -l 列出目錄下所有檔案之許可權、擁有者、檔案大小、修改時間及名稱。 ls -lg 同上,並顯示出檔案之擁有者群組名稱。 ls -R 顯示出目錄下,以及其所有子目錄之檔名。( recursive listing ) 目錄之縮寫: =========== ∼     使用者 login 時的 working directory ( 起始目錄 ) ∼username 指定某位 user 的 working directory ( 起始目錄 ) .. 目前的工作目錄 ( current working directory ) .. 目前目錄的上一層目錄 ( parent of working directory) 改變工作目錄位置 ================ 執行格式:cd [name] :name 可為目錄名稱、路徑或目錄縮寫。 Example: cd 改變目錄位置,至使用者 login 時的 working directory (起始目錄)。 cd dir1 改變目錄位置,至 dir1 之目錄位置下。 cd ~user 改變目錄位置,至使用者的 working directory (起始目錄)。 cd .. 改變目錄位置,至目前目錄的上層( 即 parent of working directory) cd ../user 改變目錄位置,至相對路徑 user 之目錄位置下。 cd /../.. 改變目錄位置,至絕對路徑( Full path ) 之目錄位置下。 複製檔案 ======== 執行格式: cp [-r] source destination Example: cp file1 file2 將檔案 file1 複製成 file2 cp file1 dir1 將檔案 file1 複製到目錄 dir1 下,檔名仍為 file1。 cp /tmp/file1 . 將目錄 /tmp 下的檔案 file1 複製到現行目錄下,檔名仍為 file1。 cp /tmp/file1 file2 將目錄 /tmp 下的檔案 file1 複製到現行目錄下,檔名為 file2。 cp -r dir1 dir2 (recursive copy) 複製整個目錄。 若目錄 dir2 不存在,則將目錄 dir1,及其所有檔案和子目錄,複製 到目錄 dir2 下,新目錄名稱為 dir1。若目錄 dir2 不存在,則將 dir1,及其所有檔案和子目錄,複製為目錄 dir2。 搬移或更改檔案、目錄名稱 ======================== 執行格式: mv source destination Example: mv file1 file2 將檔案 file1,更改檔名為 file2。 mv file1 dir1 將檔案 file1,移到目錄 dir1 下,檔名仍為 file1。 mv dir1 dir2 若目錄 dir2 不存在,則將目錄 dir1,及其所有檔案和子目錄,移 到目錄 dir2 下,新目錄名稱為 dir1。若目錄 dir2 不存在,則將 dir1,及其所有檔案和子目錄,更改為目錄 dir2。 建立新目錄 ========== 執行格式: mkdir directory-name Exmaple : mkdir dir1 建立一新目錄 dir1。 刪除目錄 ======== 執行格式: rmdir directory-name 或 rm directory-name Example : rmdir dir1 刪除目錄 dir1,但 dir1 下必須沒有檔案存在,否則無法刪除。 rm -r dir1 刪除目錄 dir1,及其下所有檔案及子目錄。 刪除檔案 ======== 執行格式: rm filename (filename 可為檔名,或檔名縮寫符號。) Example : rm file1 刪除檔名為 file1 之檔案。 rm file? 刪除檔名中有五個字元,前四個字元為file 之所有檔案。 rm f* 刪除檔名中,以 f 為字首之所有檔案。 檔名的縮寫符號 ============== ? 代表檔案名稱中之單一字元。 * 代表檔案名稱中之一字串。 列出目前所在之目錄位置 ====================== 執行格式: pwd 查看檔案內容 ============ 執行格式: cat filename Example : cat file1  以連續顯示方式,查看檔名 file1 之內容。 執行格式: more filename 或 cat filename | more Example : more file1  以分頁方式,查看檔名 file1 之內容。 cat file1 | more 同上。 查看目錄所佔磁碟容量 ==================== 執行格式: du [-s] directory Example : du dir1 顯示目錄 dir1 的總容量及其次目錄的容量(以 k byte 為容量)。 du -s dir1 顯示目錄 dir1 的總容量。 查看自己的 disk quota 使用狀況 ============================== disk quota : 工作站磁碟空間的使用限額。 執行格式: quota -v Example : quota -v 將會顯示下列訊息 Filesystem usage quota limit timeleft files quota limit timeleft /home/ice/u01 9344 8192 12288 1.9 days 160 0 0 欄位解說: usage : 目前的磁碟用量。 quota : 你的磁碟使用額度。當你的 usage 超過 quota 時,雖然可以繼續使用,但是 必須七天之內降到 quota 以下,否則即使用量沒有超 limit(最高限額),也無 法再寫入或複製任何檔案。 limit : 最高使用額度。當你的 usage 達到 limit 時,無法再寫入或複製任何檔案。 檔案傳輸 ======== .拷貝檔案或目錄至遠端工作站 ============================ 執行格式: rcp [-r] source hostnome:destination ( source 可為檔名、目錄名或路徑,hostnome 為工作站站名,destination 為路徑名稱 )。 Example : rcp file1 doc:/home/user 將檔案 file1,拷貝到工作站 doc 路徑 /home/user 之目錄下。 rcp -r dir1 doc:/home/user 將目錄 dir1,拷貝到工作站 doc 路徑/home/user 之目錄下。 .自遠端工作站,拷貝檔案或目錄 =============================== 執行格式: rcp [-r] hostname:source destination ( hostname 為工作站名,source 為路徑名,destination 可為檔名、目錄名或路徑 )。 Example : rcp doc:/home/user/file1 file2 將工作站 doc 中,位於 /home/user 目錄下之目錄 dir1,拷貝到目前工作站之目錄下, 目錄名稱仍為 dir1。 rcp -r doc:/home/user/dir1 . 將工作站 iis1 中,位於 /home/user 目錄下之目錄 dir1,拷貝到目前工作站之目錄下, 目錄名稱仍為 dir1。 .本地工作站與遠端工作站之間檔案傳輸 ==================================== ( 必須擁有遠端工作站之帳號及密碼,才可進行傳輸工作 ) 執行格式: ftp hostname or ftp ip_address Example : ftp doc 與遠端工作站 doc ,進行檔案傳輸 Name (doc:user-name) : 輸入帳號 Password (doc:user-name): 輸入密碼 ftp> help 列出 ftp 檔案傳輸,可使用之任何命令。 ftp> !ls 列出本地工作站,目前目錄下之所有檔名。 ftp> !pwd 列出本地工作站,目前所在之工作目錄位置。 ftp> ls 列出遠端工作站目前目錄下之所有檔名。 ftp> dir 列出遠端工作站目前目錄下之所有檔名(略同於 UNIX 的 ls -l 指令)。 ftp> dir . |more 同上,但每頁會暫停(可能不適用 Unix 以外的 ftp)。 ftp> pwd 列出遠端工作站目前所在之目錄位置。 ftp> cd dir1 更改遠端工作站之工作目錄位置至 dir1 之下。 ftp> get file1 將遠端工作站之檔案 file1 ,拷貝到本地工作站中。 ftp> put file2 將本地工作站之檔案 file2 ,拷貝到遠端工作站中。 ftp> mget *.c 將遠端工作站中,副檔名為 c 之所有檔案,拷貝到本地工作站中。 ftp> mput *.txt 將本地工作站中,副檔名為 txt 之所有檔案,拷貝遠端工作站中。 ftp> prompt 切換交談式指令(使用 mput/mget 時不用每個檔案皆詢問yes/no)。 ftp> quit 結束 ftp 工作。 ftp> bye 結束 ftp 工作。 註: 從PC與工作站間的檔案傳輸也可透過在 PC端的 FTP指令進行檔案傳輸,指令用法與 上所述大致相同。 檔案模式之設定 ============== .改變檔案或目錄之讀、寫、執行之允許權 ====================================== 執行格式:chmod [-R] mode name ( name 可為檔名或目錄名;mode可為 3 個 8 位元之數字,或利用ls -l 命令,列出 檔案或目錄之讀、寫、執行允許權之文字縮寫。) mode : rwx rwx rwx r:read w:write x:execute user group other 縮寫 : (u) (g) (o) Example : %chmod 755 dir1  將目錄dir1,設定成任何使用者,皆有讀取及執行之權利,但只有擁有者可做修改。 %chmod 700 file1 將檔案file1,設定只有擁有者可以讀、寫和執行。 %chmod o+x file2 將檔案file2,增加擁有者可以執行之權利。 %chmod g+x file3 將檔案file3,增加群組使用者可執行之權利。 %chmod o-r file4 將檔案file4,除去其它使用者可讀取之權利。 .改變檔案或目錄之擁有權 ======================== 執行格式:chown [-R] username name ( name 可為檔名或目錄名。) Example : %chown user file1 將檔案 file1 之擁有權,改為使用者 user 所有。 %chown -R user dir1 將目錄 dir1,及其下所有檔案和子目錄之擁有權,改為使用者 user 所有。 檢查自己所屬之群組名稱 ====================== 執行格式:groups .改變檔案或目錄之群組擁有權 ============================ 執行格式:chgrp [-R] groupname name ( name 可為檔名或目錄名 ) Example : %chgrp vlsi file1 將檔案 file1 之群組擁有權,改為 vlsi 群組。 %chgrp -R image dir1 將目錄dir1,及其下所有檔案和子目錄,改為 image 群組。 .改變檔案或目錄之最後修改時間 ============================== 執行格式:touch name ( name 可為檔案或目錄名稱。) 檔案之連結 ========== 同一檔案,可擁有一個以上之名稱,可將檔案做數個連結。 執行格式:ln oldname newname ( Hard link ) Example : ln file1 file2   將名稱 file2,連結至檔案 file1。 執行格式:ln -s oldname newname ( Symblick link ) Example : ln -s file3 file4 將名稱 file4,連結至檔案file3。 檔案之字串找尋 ============== 執行格式:grep string file Example : grep abc file1 尋找檔案file1中,列出字串 abc 所在之整行文字內容。 找尋檔案或命令之路徑 ==================== 執行格式:whereis command ( 顯示命令之路徑。) 執行格式:which command ( 顯示命令之路徑,及使用者所定義之別名。) 執行格式:whatis command ( 顯示命令功能之摘要。) 執行格式:find search-path -name filename -print ( 搜尋指定路徑下,某檔案之路徑 。) Example : %find / -name file1 -print ( 自根目錄下,尋找檔名為 file1 之路徑。) 比較檔案或目錄之內容 ==================== 執行格式:diff [-r] name1 name2 ( name1 name2 可同時為檔名,或目錄名稱。) Example : %diff file1 file2 比較檔案 file1 與 file2 內,各行之不同處。 %diff -r dir1 dir2 比較目錄 dir1 與 dir2 內,各檔案之不同處。 檔案列印輸出 ============ 使用者可用 .login 檔中之 setenv PRINTER,來設定列印資料時的列表機名。 printername :sp1 或 sp2 (1005 教室) Example : %setenv PRINTER sp2 設定自 sp2 列印資料。 一般檔案之列印 ============== 執行格式:lpr [-Pprinter-name] filename %lpr file1 或 lpr -Psp2 file1 自 sp2,列印檔案 file1。 執行格式:enscript [-Pprinter-name] filename %enscript file3 或 enscript -Psp1 file3 自 sp1 列印檔案 file3。 .troff 檔案之列印 ================== 執行格式:ptroff [-Pprinter-name] [-man][-ms] filename %ptroff -man /usr/local/man/man1/ptroff.1 以 troff 格式,自 Apple laser writer 列印 ptroff 命令之使用說明。 %ptroff -Psp2 -man /usr/man/man1/lpr1 以 troff 格式,自 sp2 列印 lpr 命令之使用說明。 列表機控制命令 ============== .檢查列表機狀態,及列印工作順序編號和使用者名稱 ================================================ 執行格式:lpq [-Pprinter -name] %lpq 或 lpq -Psp1 檢查 sp1 列表機之狀態。 .刪除列表機內之列印工作 ( 使用者僅可刪除自己的列印工作 ) ======================== 執行格式:lprm [-Pprinter -name] username 或 job number %lprm user 或 lprm -Psp1 user 刪除 sp1 中,使用者 user 的列印工作,此時使用者名稱必須為 user。 %lprm -Psp2 456 刪除 sp2 編號為 456 之列印工作。 Job 之控制 =========== UNIX O.S.,可於 foregrourd 及 background 同時處理多個 process。 一般使用者執行命令時,皆是在 foreground 交談式地執行 process,亦可將 process 置於 background 中,以非交談式來執行 process。 .查看系統之 process ==================== 執行格式:ps [-aux] Example: %ps 或 ps -x (查看系統中,屬於自己的 process。) %ps -au   (查看系統中,所有使用者的 process。) %ps -aux   (查看系統中,包含系統內部,及所有使用者的 process。) .結束或終止 process ==================== 執行格式:kill [-9] PID ( PID 為利用 ps 命令所查出之 process ID。) Example: %kill 456 或 kill -9 456 終止 process ID 為 456 之 process。 .在 background 執行 process 的方式 =================================== 執行格式:command & (於 command 後面加入一 "&" 符號即可。) Example: %cc file1.c & 將編譯 file1.c 檔案之工作,置於 background 執行。 執行格式:按下 "Control Z" 鍵,暫停正在執行的 process。鍵入 "bg" 命令, 命令,將所暫停的 process,置入 background 中繼續執行。 Example: %cc file2.c ^Z Stopped %bg .查看正在 background 中執行的 process ====================================== 執行格式:jobs .結束或終止在 background 中的 process ====================================== 執行格式:kill %n (n 為利用 "jobs" 命令,所查看出的 background job 編號) Example: %kill % 終止在 background 中的第一個 job。 %kill %2 終止在 background 中的第二個 job。 shell varialbe ============== .查看 shell variable 之設定值 ============================== 執行格式:set    查看所有 shell variable 之設定值。 %set 執行格式:echo $variable-name 顯示指定的 shell variable 之設定值。 %echo $PRINTER sp1 .設定 shell variable ===================== 執行格式:set var = value Example: %set term=vt100 設定 shell variable "term" 為 VT100 終端機之型式。 .刪除 shell variable ===================== 執行格式:unset var Example: %unset PRINTER 刪除 shell variable "PRINTER" 之設定值。 environment variable ===================== .查看 environment variable 之設定值 ==================================== 執行格式:setenv  查看所有 environment variable 之設定值。 Example: %setenv 執行格式:echo $NAME 顯示指定的 environment variable "NAME" 之設定值。 Example: %echo $PRINTER 顯示 environment variable "PRINTER" 列表機名稱之設定值。 .設定 environment variable =========================== 執行格式:setenv NAME word Example: %setenv PRINTER sp1 設定 environment variable "PRINTER" 列表機名稱為 sp1。 .刪除 environment variable =========================== 執行格式:unsetenv NAME Example: %unsetenv PRINTER 刪除 environment variable "PRINTER" 列表機名稱之設定值。 alias ===== .查看所定義的命令之 alias ========================== 執行格式: alias 查看自己目前定義之所有命令,及所對應之 alias 名稱。 執行格式: alias name 查看指定之 alias 名稱所定義之命令。 Example: %alias dir (查看別名 dir 所定義之命令) ls -atl .定義命令之 alias ================== 執行格式: alias name 'command line' Example: % alias dir 'ls -l' 將命令 "ls - l" 定義別名為 dir。 .刪除所定義之 alias ==================== 執行格式: unalias name Example: %unalias dir (刪除別名為 dir 之定義。) %unalias * (刪除所有別名之設定。) history ======= .設定命令記錄表之長度 ====================== 執行格式: set history = n Example: %set history = 40 設定命令記錄表之長度為 40 (可記載執行過之前面 40 個命令)。 .查看命令記錄表之內容 ====================== 執行格式: history .使用命令記錄表 ================ 執行格式: !! Example: %!! (重覆執行前一個命令) 執行格式: !n ( n 為命令記錄表之命令編號。) Example: %!5 ( 執行命令記錄表中第五個命令。) 執行格式: !string ( 重覆前面執行過以 string 為起始字元之命令。) Example: %!cat ( 重覆前面執行過,以 cat 為起始字元之命令。) .顯示前一個命令之內容 ====================== 執行格式: !!:p .更改前一命令之內容並執行之 ============================ 執行格式: ^oldstring ^newstring 將前一命令中 oldstring 的部份,改成 newstring,並執行之。 Example: %find . -name file1.c -print ^file1.c^core %find . -name core -print 註:檔案 core 為執行程式或命令發生錯誤時,系統所產生的檔案。作為偵錯(debug)之用 ,因其所佔空間極大,通常將之刪除。 資料之壓縮 ========== 為了避免不常用的檔案或資料,佔用太大的磁碟空間,請使用者將之壓縮。欲使用壓縮過 的檔案或資料前,將之反壓縮,即可還原成原來之資料型式。凡是經過壓縮處理之檔案, 會在檔名後面附加 " .Z " 之字元,表示此為一壓縮檔案。 .壓縮資料 ========== 執行格式:compress filename 壓縮檔案 執行格式:compressdir directory-name 壓縮目錄 .解壓縮還原資料 ================ 執行格式:uncompress filename     反壓縮檔案 執行格式:uncompressdir directory-name 反壓縮目錄 pipe-line 之使用 ================ 執行格式:command1 | command2 將 command1 執行結果,送到 command2 做為 command2 的輸入。 Example: %ls -Rl | more 以分頁方式,列出目前目錄下所有檔案,及子目錄之名稱。 %cat file1 | more 以分頁方式,列出檔案 file1 之內容。 I/O control =========== .標準輸入之控制 ================ 執行格式:command-line < file 將 file 做為 command-line 之輸入。 Example: %mail -s "mail test" user@iis.sinica.edu.tw < file1 將檔案 file1 當做信件之內容,Subject 名稱為 mail test,送給收信人。 .標準輸出之控制 ================ 執行格式:command > filename 將 command 之執行結果,送至指定的 filename 中。 Example: %ls -l > list 將執行 "ls -l" 命令之結果,寫入檔案 list 中。 執行格式:command >! filename 同上,若 filename 之檔案已經存在,則強迫 overwrite。 Example: %ls -lg >! list 將執行 "ls - lg" 命令之結果,強迫寫入檔案 list 中。 執行格式:command >& filename 將 command 執行時,螢幕上所產生的任何訊息,寫入指定的 filename 中。 Example: %cc file1.c >& error 將編譯 file1.c 檔案時,所產生之任何訊息,寫入檔案 error 中。 執行格式:command >> filename 將 command 執行結果,附加(append)到指定的 filename 中。 Example: %ls - lag >> list 將執行 "ls - lag" 命令之結果,附加(append)到檔案 list 中。 執行格式:command >>& filename 將 command 執行時,螢幕上所產生的任何訊息,附加於指定的 filename中。 Example: %cc file2.c >>& error 將編譯 file2.c 檔案時,螢幕所產生之任何訊息,附加於檔案 error 中。 查看系統中的使用者: =================== 執行格式: who 或 finger 執行格式: w 執行格式: finger username or finger username@domainname 改變自己的 username 進入其他使用者的帳號,擁有其使用權利。 ========================================================= 執行格式: su username Example: %su user 進入使用者 user 之帳號 passwrod: 輸入使用者 user 之密碼 查看 username: ============== 執行格式: who am i 查看 login 時,自己的 username。 執行格式: whoami 查看目前的 username。若已執行過 "su"命令(switch user), 則顯示出此 user 之 username。 查看目前系上所有工作站的使用者: =============================== 執行格式: rusers => 結束 與某工作站上的使用者交談: ========================= 執行格式: talk username@hostname 或 talk username@ip_address Example: 1. 可先利用 rusers 指令查看網路上的使用者 2. 假設自己的帳號是 u84987 ,在工作站 indian 上使用,現在想要與 doc 上的 u84123 交談。 %talk u84123@doc ==> 此時螢幕上將會出現等待畫面 在對方(u84123)螢幕上將會出現下列訊息 Message from Talk_Daemon@Local_host_name at xx:xx talk: connection requested by u84987@indian talk: respond with: talk u84987@indian 此時對方(u84123) 必須執行 talk u84987@indian 即可互相交談。 最後可按結束。 檢查遠端電腦系統是否正常 ======================== 執行格式:ping hostname 或 ping IP-Address Example: %ping doc 電子郵件(E-mail)的使用簡介 ========================== 本系之 E-mail address 為 ice.ntnu.edu.tw ..將檔案當做 E-mail 的內容送出 ============================= 執行格式:mail -s "Subject-string" username@address < filename %mail -s "program" user < file.c 將 file.c 當做 mail 的內容,送至 user, subject name 為 program。 ..傳送 E-mail 給本系使用者 ======================== 執行格式:mail username %mail user ..傳送 E-mail 至 外地 ==================== 執行格式: mail username@receiver-address Example %mail paul@gate.sinica.edu.tw Subject : mail test : : 鍵入信文內容 : : 按下 "Control D" 鍵或 " . " 鍵結束信文。 連按兩次 "Control C" 鍵,則中斷工作,不送此信件。 Cc: ( Carbon copy : 複製一份信文,給其他的收信人 ) ..檢查所傳送之 E-mail 是否送出,或滯留於本所之郵件伺服站中 ========================================================= 執行格式:/usr/lib/sendmail -bp ( 若螢幕顯示為 "Mail queue is empty" 之訊息,表示 mail 已送出。 若為其它錯誤訊息,表示 E-mail 因故尚未送出。) ..讀取信件 ========= 執行格式: mail 常用指令如下: cd [directory] chdir to directory or home if none given d [message list] delete messages h print out active message headers m [user list] mail to specific users n goto and type next message p [message list] print messages q quit, saving unresolved messages in mbox r [message list] reply to sender (only) of messages R [message list] reply to sender and all recipients of messages s [message list] file append messages to file t [message list] type messages (same as print) u [message list] undelete messages v [message list] edit messages with display editor w [message list] file append messages to file, without from line x quit, do not change system mailbox z [-] display next [previous] page of headers ! shell escape 檔案編輯器 vi 之使用方法簡介 ============================ vi、celvis(cvi) 是在工作站上被廣大使用的中英文編輯軟體。對初學者而言, 常因其特殊的使用方法,而不得其門而入;對已經在使用 vi 的使用者來說,也 常見因對 vi 的不熟悉或不夠了解,而無法發揮出 vi 強大的編輯能力,以下將 介紹 vi 之使用方法簡介。 ..本文內容大綱 ============= 進入 vi 離開 vi 輸入模式 如何進入輸入模式 如何離開輸入模式 指令模式 游標的移動 視窗的移動 刪除、複製及修改指令介紹(delete、change、yank) 刪除與修改(delete、replace) 搬移與複製(delete/put、yank/put) 指令重覆 取消前一動作(undo) 字串搜尋 資料的連接與分行 環境的設定 ex 指令 其它方面 中文編輯 恢復編輯時被中斷的檔案 編輯多個檔案 vi 是 visual editor 的縮寫,是 UNIX 所提供的編輯器之一。它提供使用者一個 視窗的編輯環境,在此視窗下,使用者可編輯所要的檔案。 ..進入vi ======= 直接執行 vi編輯程式即可: %vi test 此刻螢幕上會出現 vi 的編輯視窗,同時 vi 會將檔案複製一份至記憶體中 的緩衝區 (buffer) 。 vi會保留在磁碟中的檔案不變,而先對緩衝區的檔 案作編輯,編輯完成後,使用者可決定是否要取代原來舊有的檔案。 ..離開vi ======= 若在輸入模式下,則先利用《ESC》進入指令模式,而後即可選用下列指令 離開vi。 :q! 離開vi,並放棄剛在緩衝區內編輯的內容。 :wq 將緩衝區內的資料寫入磁碟中,並離開vi。 :ZZ 同wq。 :x 同wq。 :w 將緩衝區內的資料寫入磁碟中,但並不離開vi。 :q 離開vi,若檔案被修改過,則會被要求確認是否放棄修改的內容。 此指令可與:w 配合使用。 ..vi 的操作模式 ============== vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode) 。當使用者進入 vi 後,即處在指令模式下,此刻鍵入之任何字元皆被視為 指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入 模式。 ..輸入模式 ========= 如何進入輸入模式 a (append) 由游標之後加入資料。 A 由該行之末加入資料。 i (insert) 由游標之前加入資料。 I 由該行之首加入資料。 o (open) 新增一行於該行之下供輸入資料之用。 O 新增一行於該行之上供輸入資料之用。 如何離開輸入模式 《ESC》 結束輸入模式。 ..指令模式 ========= 游標之移動 h 向左移一個字元。 j 向上移一個字元。 k 向下移一個字元。 l 向右移一個字元。 0 移至該行之首 $ 移至該行之末。 ^ 移至該行的第一個字元處。 H 移至視窗的第一列。 M 移至視窗的中間那列。 L 移至視窗的最後一列。 G 移至該檔案的最後一列。 + 移至下一列的第一個字元處。 - 移至上一列的第一個字元處。 ( 移至該句之首。 (註一) ) 移至該句之末。 { 移至該段落之首。 (註二) } 移至該段落之末。 nG 移至該檔案的第 n 列。 n+ 移至游標所在位置之後的第 n 列。 n- 移至游標所在位置之前的第 n 列。 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標 所在行號佔總行號之百分比。 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。 註二:段落(paragraph)在vi中是指以空白行隔開的文字。 ..視窗的移動 =========== 視窗往下捲一頁。 視窗往上捲一頁。 視窗往下捲半頁。 視窗往上捲半頁。 視窗往下捲一行。 視窗往上捲一行。 ..刪除、複製及修改指令介紹 (此單元較少使用) ========================= d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為: Operator + Scope = command (運算子) (範圍) 運算子: d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。 y 將資料(字組、行列、句子或段落)複製到緩衝區。 p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資 料放置於游標所在位置之行列下。 c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句 子等之資料,並插入新鍵資料。 範圍: e 由游標所在位置至該字串的最後一個字元。 w 由游標所在位置至下一個字串的第一個字元。 b 由游標所在位置至前一個字串的第一個字元。 $ 由游標所在位置至該行的最後一個字元。 0 由游標所在位置至該行的第一個字元。 ) 由游標所在位置至下一個句子的第一個字元。 ( 由游標所在位置至該句子的第一個字元。 { 由游標所在位置至該段落的最後一個字元。 } 由游標所在位置至該段落的第一個字元。 整行動作 dd 刪除整行。 D 以行為單位,刪除游標後之所有字元。 cc 修改整行的內容。 yy yank整行,使游標所在該行複製到記憶體緩衝區。 ..刪除與修改 =========== x 刪除游標所在該字元。 X 刪除游標所在之前一字元。 dd 刪除游標所在該行。 r 用接於此指令之後的字元取代(replace)游標所在字元。 如: ra 將游標所在字元以 a 取代之。 R 進入取代狀態,直到《ESC》為止。 s 刪除游標所在之字元,並進入輸入模式直到《ESC》。 S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。 ..搬移與複製 ========== 利用 delete 及 put 指令可完成資料搬移之目的。 利用 yank 及 put 指令可完成資料複製之目的。 yank 和 delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令 可將緩衝區內的資料複製到螢幕上。 例: 搬移一行 •在該行執行 dd •游標移至目的地 •執行 p 複製一行 •在該行執行 yy •游標移至目的地 •執行 p ..指令重複 ========= 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n 次。 例: 刪除10行 •10dd 複製10行 •10yy •游標移至目的地 •p 指標往下移10行 •10j ..取消前一動作(Undo) =================== 即復原執行上一指令前的內容。 u 恢復最後一個指令之前的結果。 U 恢復游標該行之所有改變。 ..搜尋 ===== 在vi中可搜尋某一字串,使游標移至該處。 /字串 往游標之後尋找該字串。 ?字串 往游標之前尋找該字串。 n 往下繼續尋找下一個相同的字串。 N 往上繼續尋找下一個相同的字串。 ..資料的連接 =========== J 句子的連接。將游標所在之下一行連接至游標該行的後面。 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式 (可利用 a、i等指令)再按《Enter》即可。 ..環境的設定 =========== :set nu 設定資料的行號。 :set nonu 取消行號設定。 :set ai 自動內縮。 :set noai 取消自動內縮。 自動內縮(automatic indentation) 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自 動內縮的功能,用下例解釋之: •vi test •(進入編輯視窗後) this is the test for auto indent 《Tab》start indent ← :set ai (設自動內縮) 《Tab》data 《Tab》data 《Tab》data ← :set noai (取消自動內縮) the end of auto indent. •註: 可刪除《Tab》字元。 ..ex指令 ======= 讀寫資料 :w 將緩衝區的資料寫入磁碟中。 :10,20w test 將第10行至第20行的資料寫入test檔案。 :10,20w>>test 將第10行至第20行的資料加在test檔案之後。 :r test 將test檔案的資料讀入編輯緩衝區的最後。 刪除、複製及搬移 :10,20d 刪除第10行至第20行的資料。 :10d 刪除第10行的資料。 :%d 刪除整個編輯緩衝區。 :10,20co30 將第10行至第20行的資料複製至第30行之後。 :10,20mo30 將第10行至第20行的資料搬移至第30行之後。 字串搜尋與取代 s(substitute)指令可搜尋某行列範圍。 g(global)指令則可搜尋整個編輯緩衝區的資料。 s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。 :1,$s/old/new/g 將檔案中所有的『old』改成『new』。 :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。 :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。 ..恢復編輯時被中斷的檔案 ======================= 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前 的檔案內容。 %vi -r filename ..編輯多個檔案 ============= vi亦提供同時編輯多個檔案的功能,方法如下: %vi file1 file2 .. 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後 再利用 『:n』載入下一個檔案。