作業系統 (Operating System) |
---|
作業系統 (Operating System簡稱OS)是一套用來管理電腦資源的程式,
從使用者的觀點來看,一個作業系統的主要工作是承接使用者的指令,運用電腦資源執行
使用者的指令。電腦資源包括:
|
作業系統硬體與應用程式或使用者間,提供了三項主要功能
|
作業系統是由一組程式所構成的軟體,是電腦系統的核心與基石,
這組程式控制協調著應用軟體以及
硬體設備的正常運作,同時也提供了人類與機器之間的溝通介面。
透過作業系統,電腦才能夠接受使用者所下達的指令,進而控制
各種硬體設備、執行運算,完成使用者所要求的工作。
|
作業系統身負諸如管理與配置記憶體、決定系統資源供需的優先次序、
控制輸入與輸出裝置、操作網路與管理檔案系統等基本事務,此外還
須提供一個讓使用者與系統互動的操作介面。
|
Unix 簡史 (Unix History) |
---|
早期個人電腦尚未問世前,
中大型主機都使用自家開發的作業系統,各個作業系統
所提供的人機介面既簡陋又難用。
|
1965年, 麻省理工學院、 通用電子公司 (奇異公司) 及貝爾實驗室共同發起一個
MULTICS 計劃, 希望研發出一個可連接 10部終端機、 300 人同時使用、
並提供互動式操作介面, 相當先進的多人多工作業系統。
|
MULTICS 計劃失敗, 卻孕育了 Unix。
貝爾實驗室的 Ken Thompson 及 Dennis Ritchie 領導的工作小組共同設計
開發了原始版本的 Unix 作業系統。
|
相較於超級難用的各家作業系統,
Unix 提供的人機介面, Shell, 不但易於使用,而且Unix 系統本身也很
容易移植於各種電腦主機,
因此 Unix 受到專業使用者的普遍喜歡,成為迷你電腦主機及工作站
(Workstation) 的主要作業系統。
早期的微軟 DOS 也有很大部分是模仿 Unix
的作法,只是當年個人電腦的硬體太差,其功能遠遠落後 Unix, 因此
無法實現 Unix 很多優越的功能。
|
當 Unix 開發出來之後,貝爾實驗室將它以極低的價錢「送給」各大學,
初期其原始碼亦隨之送出,(後來發覺不對,又鎖住了。) UC Berkerly
主導開發了 UCB 版本的 Unix, (其他大學亦有很多熱心的高手參與開發工作),Unix
最風行的編輯器 vi 就是 UC Berkeley 開發的。其創作人 Bill Joy 後來與一些人
共同創辦了昇陽公司 (Sun Microsystems Inc.),專門生產 Unix 工作站,
成為工作站的霸主。
當年 Bill Joe 與 微軟的 Bill Gates 可說是電腦作業系統的雙B。
由於不同的開發團隊各自埋頭發展 Unix,造成百家爭鳴的局面, 市場上因而有了大同小異的各種版本Unix, 造成使用者不少的困擾。 經過多年的紛紛擾擾,最終由IEEE出面組織了 POSIX (Portable Operating System Interface of UNIX) 才逐漸共訂出一些標準人機介面供各廠商 遵循。 |
當個人電腦硬體功能強大之後,微軟為了使用者介面之故,走向視窗系統,
而揚棄了傳統的終端機介面,因此Unix 未能被一般非專業使用者普遍使用。
|
至今 Unix 仍然普遍為專業使用者喜歡,與微軟的視窗系統,蘋果的
Mac 共存於世。蘋果的Mac OS X 的核心也是一個 Unix,使用者可以利用
其所提供的 Terminal 應用程式下達 shell 指令操作 Mac 電腦。
如今微軟的Windows 10 也將 Bash 納入了。
|
本書注重的是 Shell Progamming,其背後的作業系統,無論是否Unix,都是適用的。
|
Unix 的特色 |
---|
移植性高
|
小而美的作業系統
|
多人多工
|
眾多的應用程式
|
可靠的安全性
|
良好的系統架構
|
Linux 簡史 (Linux History) |
---|
早期的Unix 系統都只存在於迷你電腦或工作站上,
由生產硬體的公司負責移植 Unix 於其硬體上。
而個人電腦的霸主蘋果及IBM (原始版本的 IBM PC)當然不願移植
Unix 於個人電腦上,而微軟這個靠作業系統賺錢的公司更不可能了。
現在的的個人電腦早已迥異於當年 IBM PC 的架構,
並不專屬於哪一個硬體公司,
只能依賴志願者移植Unix 到 PC 架構的個人電腦上。
Linux 就是其中的佼佼者。
由於 Unix 是貝爾實驗室的商標,
所以各個商業版本的 Unix 都不敢用 Unix 當作產品的名稱。
|
Linux 的發展是從芬蘭 Helsinki 大學的學生 Linus Torvalds 開始的,
其構想源自於比較早期發展的 Minix。 在所有版本的個人電腦 Unix 中,
Linux 功能最強大,現在已成為個人電腦 Unix 的首選。
|
Linux 的特色 |
---|
友善美觀的圖形介面
|
多重開機管理
|
多人多工系統
|
優異的網路能力
|
眾多的程式開發工具
|
人機介面設備 (User Interface Devices) |
---|
人機介面設備讓使用者輸入指令請作業系統執行任務,並展示結果。
早期的人機介面設備包括紙帶機,讀卡機等都只能以批次方式
執行任務。使用者交付電腦程式後,電腦逐一讀取以及執行,打印結果,
使用者在出口端等待打印出來的結果,等待時間不定,等個數天是常事,
電腦亦無儲存檔案的功能。
|
後來發展的互動式人機介面則由使用者輸入指令,電腦立刻執行,立即展示結果,
快速又方便。
互動式人機介面需要一個能即時與電腦溝通的終端機作為人機介面設備。
(註:終端機一詞源自通訊界,就是與通訊網路溝通的介面裝置,
例如電話機或 傳真機。)
通常也需要檔案系統供使用者將電腦程式以及其他資訊預先存入檔案,
需要執行電腦程式時,只需叫出來執行即可。
|
配有 RS-232通訊協定的終端機 (Terminal)
|
最早用於互動式人機介面的終端機應該是 TTY 了,TTY是由打字電報機
改裝而來,一部TTY藉由RS-232 通訊介面連上電腦主機,使用者在鍵盤上
鍵入指令,送進主機,主機執行指令,並將結果送回TTY打印在報表紙上,
完成了一次人機互動。後來終端機的輸出改用了電視用的螢幕,變成了螢幕式
的終端機,變成了人機介面的主要形式,一直沿用至今。
在個人電腦尚未興起之時,昂貴的電腦不可能由一個使用者獨佔使用,
互動式人機介面必須搭配多人共享同時使用的作業系統方符經濟效益,Unix 應運而生,
一部主機由Unix指揮服務許多終端機,每一個使用者佔用一部終端機,
大家同時共用一部電腦,所有運算都在主機上。
終端機功能簡單, 只不過單純的把使用者鍵入的資料送進主機,
並把主機送過來的資料呈現在螢幕上。
|
每一部終端機與主機之間都需要有一條 RS-232
纜線,不但佈線與維護不易,通訊距離也
有限,當電腦網路與強大的個人電腦普及之後,實體終端機就走入了歷史。
由網路虛擬終端機取代。此外,除了這種終端機-主機的工作型態之外,資訊界
還發展出各種 Client-Sever 式的工作型態。
|
![]() | ![]() |
---|
網路虛擬終端機 (Telnet via network interface)
|
有了網路之後,電腦與電腦之間可以透過網路彼此溝通,而
email, ftp, telnet則是早期最常用的三種Unix 上的網路應用程式。
而Telnet 則是將電腦模擬成一個終端機,透過網路與遠端的
Unix 系統溝通。遠端的Unix 系統則執行一個 telnet 伺服器
與使用者的 telnet 溝通。 在個人電腦時代,也有各種telnet 程式可以
使用。將個人電腦模擬成終端機連上某一個 Unix 系統伺服器之後,
就可以模擬原先終端機─主機的模式,使用Unix 系統。
|
個人電腦上的 Unix
|
在個人電腦上裝設 Linux 除了終端機式的人機介面之外,也有了
好用的視窗系統。可是玩Unix 的專家,基於工作效率之故,
很多人還是喜歡使用傳統的終端機人機介面。
|
終端機的控制 |
---|
終端機將使用者鍵入的字元送入電腦主機,而電腦主機則將欲展示的字元送給
終端機請終端機展示在螢幕上。很自然的,這些字元都使用世界標準的ASCII 編碼。
但是除了字元編碼之外,還需要一些控制碼方能順利操作一個終端機。例如:
|
在Unix 推出使用之初期,各家終端機廠牌都有各自的控制碼,並無世界標準,
Unix 裝在一部電腦之後,並不知道連上電腦的終端機是何型式,很多功能便
無法使用。像 vi 這種需要控制游標位置的編輯器便無法順利運作了。
因此,Unix 建了一個資料表,放在 /etc/temcap 或
/etc/teminfo,將各種型號的控制碼記錄於內。
使用者可將使用的終端機型號定義在環境變數 TERM
中,如此,終端機與電腦的互動才能順暢。
後來美國標準局雖然制定了一個 ANSI
標準,但為了支援市面上既存的各種終端機,作業系統
無法因此而簡化。
|
Login, Logout, and Session |
---|
|
| |
Shell |
---|
Shell as a command interpreter
|
進入Unix系統之後,系統會啟動一個 "shell"程式來執行使用者
所下的指令。
|
shell 有好幾種版本,例如: sh, csh, tcsh, bash ...等等。而 sh 又稱 Bourne shell,
是最原始版本的 shell,
大部分的系統都有內建,路徑通常是 /bin/sh,本文所舉之例子主要以 sh 或 ksh 之語法為準。
|
Login Shell
|
使用者login時,系統所叫出來接受使用者所下指令的shell又稱為
login shell。
|
每個使用者的login shell的版本記錄在 /etc/passwd 中,
使用者可請系統管理者改變 login shell 的版本
|
Shell |
---|
Shell as a programming language
|
Shell 是一個程式,但並不僅僅將使用者鍵入之指令逐一執行
|
Shell 語法其實也是一種程式語言
|
類似 C 或 Java 等程式語言
具有變數與流程控制等功能應付各種千變萬化的指令執行流程。
|
使用者可根據任一種shell之特定語法撰寫 shell script 然後呼叫
對應的shell程式來執行。
|
而login shell 則把使用者所打進之所有指令當成一個 shell script
來執行,因此,^D 這個"end-of_file"的符號可以用來logout,
因為login shell 把它當作使用者 shell script 文檔的結束符號。
|
Shell |
---|
Shell script (and all executables) as a system command
|
一個 shell script 可以呼叫另一個script 以及任何一個執行檔來執行,
使得他們看來像內建的系統指令。
我們常見的指令,ls, cat, cp, rm 等其實都不是內建指令,而是放在
某個目錄下的執行檔而已。
因此,shell 變成可以無限擴張的一個programming language。
(其實Shell的原始設計目的就是在安排各種執行檔的先後次序,只是功能
太強大了,其所能發揮的功能已經遠遠超過其原始設計目的。)
|
易混淆的錯誤訊息 |
---|
File not found
|
一般的程式語言在執行時,最常見的錯誤訊息是 syntax error (語法錯誤),
但 Unix 使用者在下指令時,或執行一個 Shell script 時,
經常會得到 "file not found" 的錯誤訊息,
讓初學者誤解,造成程式設計者除錯的困難。
|
這是因為當Shell在剖析使用者所下的指令時,若得到的結果
不是一個內建指令的關鍵詞(例如:if, the, for, test, 等)
會將該指令當成一個外部指令,亦即,一個存在某個目錄下面的
執行檔。Shell會依照環境變數 PATH 所記錄的所有目錄逐一尋找符合名稱
的執行檔,若找到,就拿來執行,若全部目錄都找不到,只好
放棄,並送出一個 "file not found" 的錯誤訊息。
|
執行檔名稱與內建指令衝突產生的錯誤
|
執行檔的命名不可與內建指令相同,因為 shell 會優先執行內建指令。
當使用者無意中將一個執行檔命名為一個內建指令名稱時,Shell
不會去執行這個檔案,而是執行內建指令,因而發生錯誤。當發生這種
情形時,因Shell被騙了而走入叉路,所發出的錯誤訊息會誤導使用者。
程式設計師可能花很多時間都無法找到錯誤的真正原因。
|
初始化檔案 .profile |
---|
如同剛拿到一部個人電腦必須先進行很多設定的工作一樣, 使用者一進入系統之後,
必須進行初始化工作,例如環境變數的設定。
為了減少使用者的負擔,使用者可以撰寫一個 shell script 並命名為 .profile
放在根目錄。
Shell 在啟動時,會到使用者的根目錄去找 .profile 並執行它。
大部分的初階使用者無力自行設定環境,系統管理者通常會為所有
使用者設計一個標準的 .profile 預先放在使用者的根目錄。
進階使用者可以根據自己的需要自由改寫 .profile。
最常見的兩項動作是,增加 PATH 內的目錄路徑以及定義一些自訂的變數。例如:
|
Environment Variable (環境變數) |
---|
環境變數類似全域變數, 但不同於一般的全域變數,
環境變數可以存活到子程序中。但子程序中對環境變數作的變更
在子程序結束時就作廢,不會影響到該變數在母程序中的值。
|
當你輸入set 指令,你會看到一些幾個重要的環境變數,例如:
|
環境變數 | 意義
| |
---|
環境變數之設定
|
使用者可以任意以shell指令之方式任意設定環境變數的內容,例如:
|
Some Tips with .profile |
---|
幾個環境變數的使用技巧
|
將常用的目錄定義於環境變數中
|
Unix 的重度使用者常常需要在各種不同的目錄跳來跳去,非常繁瑣,
也浪費時間,類似於視窗系統中,將某些 folder 設為捷徑,使用者可以將
將去的或常使用的目錄定義於環境變數中,
以方便變換目錄之檔案,使用起來非常方便。
例如:
|
將 $HOME/bin 包含在環境變數 $PATH 中
|
將使用者自行開發的 script及各種執行檔集中放在一個
目錄(例如 $HOME/bin),然後登記在 $PATH 環境變數中,以備
使用者在任何目錄都可以輕易使用這些 script 及
執行檔。
|
檔案系統介紹 |
---|
檔案的概念
|
在Unix中免不了要處理一些文件,而這些一篇篇的文件我們就叫做檔案。
就像是一篇文章有它的標題一般,一份檔案我們也可以替它取名字,
在同一目錄下不同的檔案不可有相同的檔名,
在不同目錄下不同的檔案則可以有相同的檔名。
|
Unix 的檔案,不一定是文件,也可能是目錄,也可能是終端機,或其他硬體設備。
這是Unix 的重要
理念之一,他把很多硬體軟體物件統一用檔案來表示,很多硬體設備的操作,可以用
檔案的操作來取代,例如:要將一段文字呈現在其他使用者的螢幕上時,可以將
這段文字寫到代表那個終端機的檔案去。(其實這就是目前網路上極為
風行的即時訊息,LINE就是其中一種)。
假設代表某一個其他使用者的終端機的檔案是
/dev/tty98, 我們可用下列指令將檔案"myfile"的內容展現在他的終端機上:
|
註:由於安全的問題,現在的多人使用 Unix
系統都將讀寫的權限關閉,只有 Super user
可以執行這樣的動作,但同一使用者所開的不同終端機之間還是
可以執行此類動作。
|
Unix的檔案系統呈樹狀結構,包含了目錄(Directory)和檔案(file) 。
|
檔案系統介紹 - 目錄(Directory) |
---|
如果所有檔案都放在一起,一旦檔案一多,無論查看、管理起來都很麻煩。這
個時候就有目錄的概念產生(就是我們俗稱的資料夾):我們可以把相同性質的檔案放在同一個目錄下。
一個目錄下面可以包含許多檔案或目錄,相對於某個目錄,其下層的目錄稱為
"子目錄" (subdirectory) ,它們也都具有相
同性質。由這些目錄所構成的一層層分枝,看起來就像一棵樹,所以才叫樹狀
結構,而最上面的目錄稱作"根目錄"。
(註: 本書為了遵從讀者的習慣,適當時機會採用資料夾這個翻譯,尤其是在
個人電腦上處理檔案時。)
|
這是檔案系統簡圖,很像一棵樹吧!
|
例
|
檔案系統介紹 - 工作目錄 |
---|
使用者進入系統之後,系統會將使用者放在一個目錄下,
通常就是使用者自己的根目錄,
而這個目錄會記錄在 $HOME 環境變數中,使用者可以用 cd
指令來切換到任意的目錄,
而目前所在的目錄, 稱為工作目錄(Working
directory),或當前工作目錄(Current working
directory)、或當前目錄(Current
directory)。使用者在下指令時,
系統會將工作環境設定在Current Directory。
再者,使用者可在此目錄之下,用相對檔名存取檔案。
例如:
|
指令 | 意義
|
|
|
| |
---|
對每一個目錄而言,"."這個符號代表現在這個目錄,而".."則代表現在目錄的上一層目錄。
例如:
|
指令 | 意義
|
|
| |
---|
檔案權限 |
---|
每一個檔案,都附有不同的使用權限(permission)。使用權限分成讀、寫、
執行三種。一個檔案的擁有者(owner)可設定對不同類的使用者開放各種權限。
使用者分為三種,第一是擁有者
(owner)、第二為與擁有者同在一組的使用者(group)、
第三是其他使用者(others)。
以下是利用 “ls –l”指令以長格式列出所有檔案及子目錄。
|
在每個檔案前有十個字元,第一個字元註記檔案形式,d 是目錄,-
是檔案。從第二到第十字元則註記使用權限,每三個字元為一組,
一共三組,每一組負責註記某一類使用者對於該檔案的使用權限。
每一組的三個字元分別註記<讀、寫
、執行>等權限的開放與否,以r、w、x表示開放,
以-表示關閉。第一組是
owner 的權限,第二組是group的權限,第三組是others的權限。
|
例
|
設定或改變檔案之使用權限 |
---|
chmod 可用來改變檔案權限的指令,其格式如下:
|
數字法
|
八進位碼 | 二進位碼
rwxrwxrwx | 意義
400
| 100000000
| readable by owner
| 200
| 010000000
| writable by owner
| 100
| 001000000
| executable by owner
| 040
| 000100000
| readable by group
| 020
| 000010000
| writable by group
| 010
| 000001000
| executable by group
| 004
| 000000100
| readable by others
| 002
| 000000010
| writable by others
| 001
| 000000001
| executable by others
| |
---|
符號法
|
使用者類別 | u | user(owner)
g
| group
| o
| others
| a
| all
| 使用權限類別
| r | readable
| w
| writable
| x
| executable
| |
---|
例
|
指令 | 意義
|
|
|
|
| |
---|
檔案及目錄的命名 |
---|
檔案的名字除了"/" 之外的字元都可以用來為檔案命名。檔案及目錄名字的
長度限制隨系統而定。檔案開頭是"." 的檔案是隱藏檔,用陽春的"ls"指令
是看不到這些隱藏檔的。得加上"-a" 參數才會列出隱藏檔。
不過,從很多痛苦的經驗中得到一個教訓是:最好不要用奇怪的特殊字元
(包括space)來命名以免自找麻煩。
|
微軟系統下的檔案名稱經常含有空白字元,國人也喜歡用中文檔名。
當要用Unix 處理這些檔案時,常因此種名稱導致非常不方便的結果。
建議盡量使用英文命名。
|
如果檔案名稱的第一個字元是"-"時,
要刪除或複製時都是很麻煩。例如,要刪除一個檔案"-myfile":
|
檔案系統介紹 - 路徑 (PATH) |
---|
使用者或程式可以存取Unix 整個檔案系統內的任一檔案,如果要存取的檔案不在目前
工作目錄中時,使用者要如何抓到一個檔案?
最笨的方法是逐步切換工作目錄到包含該檔案的目錄下,再行存取,猶如在Windows系統中,
使用者要一層層逐步打開目錄一樣,非常麻煩。
另一個方法是使用路徑,由系統根目錄起
將一個檔案的所有上層目錄逐層全部列出來中間以'/' 隔開,即為該檔案的"路徑"。
路徑其實可以說是檔案的”全名”。
例如a目錄下的b目錄下的c檔案,其路徑就是 /a/b/c 。而路徑又分成以下
兩種:
|
|
| |
檔案處理 |
---|
Unix中大部分的工具程式多半以文字檔(類似微軟的 .txt
格式)為標的,極少使用特殊格式的檔案,因此檔案不會被任何工具程式所綁住,
而且各個程式很容易分享檔案,也容易像七巧板一般,將數個工具程式組合起來
合成一個新的功能。
|
文字檔案是一行行橫排的ASCII characters,行與行之間用<CR>或<NL>
分開。
而多半的工具程式是以行為處理單位的,例如head -100可抓到前100行的文
字,而 |
處理檔案的指令
|
指令 | 意義
|
|
|
|
|
|
|
|
|
|
|
| |
---|
I/O轉向與管線 (I/O Redirection and Pipe) |
---|
標準輸入/輸出/錯誤 及I/O轉向 與 管線
|
一個程式在執行時常常需要從輸入檔讀進資料並將運算結果儲存在輸出檔中。
在Unix出現之前,傳統作業系統中,
一個程式的輸出檔與輸入檔的檔名都是寫死在程式中的,
非常難以改變。
Unix做了一個革命性的改進,除了提供傳統的輸出輸入方式之外,還額外提供
了一個方法讓使用者可以任意改變輸入輸出的標的。
Unix 定義了標準輸入檔及標準輸出檔,只要一個程式
從標準輸入檔讀進資料並將運算結果儲存在標準輸出檔中,使用者就能運用
I/O 轉向將輸入或輸出導向任意的檔案。
標準輸入檔的預設值是鍵盤,而
標準輸出檔的預設值是螢幕。
例如: 'ls'這個指令的輸出是螢幕,將一個目錄內的全部或部分檔案名稱列在螢幕上。
但如果要將'ls'這個指令的執行結果放入一個檔案,便可以用下法:
對比於我們常用的視窗系統,要將一個資料夾內的檔案名稱存入一個檔案中, 沒有方便的方法。 |
Unix 系統主動為每一個程序(Process)預設開啟三個檔案:
標準輸入(檔案代碼為 0),預設連結到鍵盤;標準輸出(檔案代碼為
1),預設連結到螢幕;標準錯誤(檔案代碼為 2),
通常也是預設連結到螢幕。
|
名稱 | 簡稱 | File Descriptor
|
|
|
|
|
| |
---|
使用者可以改變預設的連結到其他檔案。
|
|
| |||||
|
| |||||
|
| |||||
|
|
標準錯誤輸出(STDERR, standard error),
用來顯示錯誤訊息,如果標準輸出(STDOUT)已經被轉向到一個檔案去,
我們還是可以從螢幕上看到錯誤訊息。
在 Bourne Shell (sh) 及 Korn Shell (ksh) 中,
可以使用"2>"符號把它轉向到另一個檔案,
當然也可以將 STDOUT 及 STDERR合併轉向到同一檔案去。
|
合併標準輸出(STDOUT)與標準錯誤輸出(STDERR)
|
當撰寫一個電腦程式時,在除錯的過程中,
經常要將錯誤資訊儲存起來慢慢分析,如前所述可用 2>
將標準錯誤輸出(STDERR)轉向到一個檔案,如果
要合併標準輸出(STDOUT)與標準錯誤輸出(STDERR)並且存到
一個檔案時,就需用到
|
輸入轉向 |
---|
輸入轉向
|
當一個程式需要從鍵盤輸入資訊,但不想麻煩使用者跟系統作互動性輸入時,
可用I/O轉向法達到目的。
先將需要由鍵盤打進去的資料放在一個檔案內,再用輸入轉向請程式改由這個檔案讀取資料。
|
利用輸入轉向自動編輯檔案
|
當我們要重複編輯一批檔案時,可以利用輸入轉向自來動編輯檔案。
可以節省大量繁瑣的編輯工作。
(不適用螢幕編輯器 screen editor,例如 vi 或 emacs)。
先將編輯器的編輯指令放進一個檔案(例如s.o),
然後利用輸入轉向讓Shell 自動編輯文件。
|
例如我們要使用 ex 編輯器來刪除一個段落(第10行到第20行)時,
須下一個如下的 ex 指令:
|
方法一: 雙檔案方式
|
第一種方法是先將編輯指令存放在另一個檔案內,例如
s.o,再用I/O轉向來取代鍵盤輸入,script 如下:
但是這個方法需要額外建一個 s.o檔案,增加檔案管理的負擔。而 方法二則不須另建檔案。 |
方法二(Here): 單一檔案方式
|
方法二是直接在一個script中利用另一種輸入轉向,簡稱 Here 法,
將編輯指令直接餵給 ex, 例子如下:
後面的符號('%')必須單獨佔用一行,且必須是該行第一個字元。 |
方法二的優點是不須額外建一個儲存編輯指令的檔案,
檔案管理較為單純。 但是有兩個缺點。
|
方法三 (方法一的改良版)
|
方法三是直接在一個 shell script中利用 echo (或其他程式)
將編輯指令存放在另一個檔案內,再用I/O轉向來取代鍵盤輸入,
此法是方法一的改良版,只需要一個檔案,管理比較簡單,
shell script 如下:
|
Pipe |
---|
管線(Pipe)
|
"|" 是 Pipe 的符號,就像一根管子一般將左右
兩邊指令的輸出和輸入連接起來。
左邊指令的輸出,會當作右邊指令的輸入。
|
在沒有 Pipe 這種機制之前,使用者只能將一個指令或程式執行的結果
暫時存在一個暫存檔,再執行另一個指令(程式),而將暫存檔內的資料
餵給第二個指令作為它的輸入。非常繁瑣也不利於程式的閱讀,
尤其是當執行步驟很多時,更為頭疼。
|
I/O Rediction 及 Pipe 這兩種
機制在程式設計上具有高度的彈性,也是Unix
在早期普受歡迎的原因之一。
|
要訣: 利用 Pipeline 組成接力賽團隊,逐步完成任務
|
將一個個 Unix 指令、小工具、script等以接力方式串接起來,
共同完成一個任務,就像接力賽跑一樣。
|
程序 (Process) |
---|
一個正在執行中的程式,我們稱做 process (程序)。
Unix是多工的系統(multitasking),
可以同時執行多個程式,讓多人同時使用系統,執行程式,或讓同一個人
同時執行數個程式,例如,要「跑」一個非常耗時
的演算法程式,又要同時進行其他的工作。
但,Unix 是設計給終端機前的使用者使用的,而終端機只有一付鍵盤,
那要如何讓使用者同時執行數個程式呢?
這就要藉助於所謂的 foreground (前景) 與 background (背景) 概念了。
|
執行程式之方式可分為兩種:
前景執行(foreground)和背景執行(background)。
前景程式可以接受鍵盤輸入,但背景程式則否。
使用者在鍵盤所打進的資料,全部會送到前景程式。
一般人在絕大部分的情況下,所面對的前景程式就是 shell。
|
如何將程式放入背景去執行﹖只要在指令後面加上"&" 就行了。
系統會傳回"[n] xxxx"的訊息,n 是job id,
xxxx是process id。每一個process 都有 process id,而且不會有重覆。
使用者可以根據 process id 來控制它,
例如,可用下列指令強迫結束一個背景程式:
|
要想停止前景執行的程式,可以按<Ctrl-C>中止,若是想暫停一下,可以按
<Ctrl-Z>暫時停止執行,要恢復執行可以用 f 或 bg 來決定前景或背景執行。
|
多視窗系統中的懶人法程序管理
|
Unix 程序的管理雖然不難,但不熟練的初學者還是很麻煩,如果是在
多視窗的系統下,可以開設多個虛擬 Unix 程序,好像是多個終端機
一般,就不需要繁複的程序管理了。要結束一個停不下來的程序,只須
關掉其所在的視窗就行了。
|
背景執行相關指令 |
---|
背景程序之被迫終止
|
放在背景執行的程序,在使用者結束 session 而 logout 之後,
背景的程序都會立刻被殺掉。這樣做是避免粗心的使用者遺忘了背景
程序而佔用系統資源,尤其是當有些錯誤的程序可能會進入無窮迴圈時,
更是系統的大敵,因此 Unix 會自動殺掉無主的背景程序。
|
防止背景程序之被迫終止
|
但是使用者可能會執行一些耗時很久的程序,又不想佔用終端機時,可以
使用 nohup 來讓某個背景程序拒絕接受作業系統的中止信號,
因而不會被迫終止。例如:
|
Unix Signal |
---|
1. Signal 是UNIX系統中用來傳遞控制訊息(由一 process 到另一
process)的一種機制。
2. 雖然一個 signal 是傳送給一個程序的,
但程序本身是一個使用者撰寫的軟體,裡面不可能含有處理 Signal的程式碼,
因此我們不能期望占用CPU的程序會主動處理signal,而是當
作業系統在輪到掌控 CPU 控制權時,(Unix
是多人多工系統,多個程序輪流掌控CPU),
執行 signal 之處理,處理完畢之後,
作業系統會叫出原來的程序繼續執行讓該程序重新取回控制權。不過,
很多 signal 的處理結果是會殺掉該程序的。
|
3. Signal為一非同步訊息,由數字所構成。不同的數字所代表不同的控制訊息及
不同的處理步驟,例如signal "2" (使用者在鍵盤按下Ctrl+C",就會送出這個訊號給正在前景執行的程序)
之意義為結束目前程序。
| |
---|
常用 的HotKey與Signal的對應如下:
|
FreeBSD Signals |
---|
Signal Name | Signal | 說明
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
---|
Solaris Signals |
---|
Signal Name | Signal | 說明
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
---|
File Name Expansion (Wildcard 萬用字元) |
---|
檔名自動展開 (File Name Expansion)
|
為避免鍵入冗長的檔案名稱,Unix
讓使用者使用一些特殊符號來簡化一個或一批檔名。
當一個使用者下達一個牽涉到檔案名稱的指令時,
系統會找出所有符合這個名稱的檔案,
例如'ls A*jpg',系統會列出當前工作目錄下檔名為A開頭而以jpg
結尾的所有檔案。
這些特殊符號有人稱之為「萬用字元」(Wildcard/meta character)。
以下是常用的三種萬用字元:
|
符號 | 意義
|
|
| |
---|
例如:
|
符號 | 意義
|
|
| |
---|
當執行下列指令時:
|
Tilde Expansion
|
有些版本的 Unix 系統,另有一種萬用字元 "~"加在使用者名稱之前,
可代表該使用者的 $HOME 目錄, 例如:
|
對同一個使用者而言,"~" 等於是 $HOME,例如:
|
終端機的設定 |
---|
如先前說明的,使用者必須設定終端機型號,才能使用很多功能。
|
在csh及tcsh中可利用下列指令設定:
|
在sh, bash, ksh, zsh 中可利用下列指令設定:
|
利用 stty 可以設定終端機輸入時的控制指令
|
利用下列指令設定編輯按鍵:
|
編輯器 (Editor) |
---|
編輯器 (Editor)
|
Unix 提供數種編輯器給使用者編輯文件及程式。早期沒有
CRT螢幕終端機時,最風行的是 IBM 的打卡機及讀卡機,使用者
將指令一一在卡片上打洞,每一張卡片打一行指令,這是當時最風行的輸入
裝置。讀者在考試時,使用 2B 鉛筆塗抹答案卡,就是這種輸入裝置的一種
形式。
|
列編輯器(line editor)
|
Unix 提供數種基本的列編輯器,e, ed, 以及 ex。
使用者鍵入指令或資料,按Enter, 系統按指令執行編輯動作。
在更動檔案中某一行的錯誤時,使用者的標準動作是:
|
列編輯器還有沒有用????
|
現在已經有了更好用的編輯器,更有 Word 這種超級編輯器,
那超級難用的列編輯器還有沒有用? 讀者也許很驚訝,列編輯器不但還有用,
而且還有大用。想看看,在shell script 自動執行中,
如果有編輯文字的需要,怎麼辦?
只能靠這種能閉著眼睛執行編輯指令的列編輯器了。
筆者數十年來寫出數以萬計的 script 中絕大部分會用到列編輯器。
|
可視化編輯器 (Visual Editor)
|
vi 及 emacs 是 Unix
最風行的兩個可視化編輯器,使用者可以操縱
螢幕上的游標,對游標所指的地方進行編輯。
當然,使用這種編輯器的先決條件是要有一個能操縱游標的 CRT
螢幕。(現在都由個人電腦上的虛擬終端機取代了)。
|
任務控制 (Job Control) |
---|
因為Unix是多人多工的作業系統,所以在同一時間內會有許多程式同時執行。我們
稱每一個正在執行的程式叫做 程序 (process) 。對作業系統而言,每一個
程序是使用者交付的 任務 (Job)。
一個使用者也可以同時交付很多個任務。以下是控制任務 (Job)的指令:
|
指令 | 意義
|
|
|
|
|
|
|
| |
---|
命令列的編輯 |
---|
命令列的編輯 (Command-line editing)
|
相對於視窗系統用滑鼠點擊就能作事,
使用命令列操作電腦的系統都有一個惱人的問題:
就是要敲很多很多鍵盤來作事。
當需要重複下達相同或類似指令時,
如果能重複使用或修改先前所下過的指令的話,
那可就功德無量了,
命令列編輯種種功能就是讓使用者找回
先前所下過的指令加以修改使用。Korn Shell,
C shell, Bash Shell等都有這種功能。以
Korn Shell 為例,ksh 會記錄先前所下過的指令,使用者可以用
ESC 進入命令編輯模式將記錄下的指令當成一個檔案,
利用預設的編輯器搜索所要重複使用的指令並進行編輯,
再送給Shell去執行。
使用者可以設定 VISUAL 環境變數指定喜歡的編輯器。
|
指令介紹 |
---|
指令 | 意義
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
---|