Unix的使用

作業系統 (Operating System)

Unix 簡史 (Unix History)

Unix 的特色

Linux 簡史 (Linux History)

Linux 的特色

人機介面設備 (User Interface Devices)

終端機的控制

Login, Logout, and Session

Shell

Shell

Shell

易混淆的錯誤訊息

初始化檔案 .profile

Environment Variable (環境變數)

Some Tips with .profile

檔案系統介紹

檔案系統介紹 - 目錄(Directory)

檔案系統介紹 - 工作目錄

檔案權限

設定或改變檔案之使用權限

檔案及目錄的命名

檔案系統介紹 - 路徑 (PATH)

檔案處理

I/O轉向與管線 (I/O Redirection and Pipe)

輸入轉向

Pipe

程序 (Process)

背景執行相關指令

Unix Signal

FreeBSD Signals

Solaris Signals

File Name Expansion (Wildcard 萬用字元)

終端機的設定

編輯器 (Editor)

任務控制 (Job Control)

命令列的編輯

指令介紹


Untitled Document
作業系統 (Operating System)
   
作業系統 (Operating System簡稱OS)是一套用來管理電腦資源的程式, 從使用者的觀點來看,一個作業系統的主要工作是承接使用者的指令,運用電腦資源執行 使用者的指令。電腦資源包括:
  1. 處理器 (Processor, CPU)
  2. 主記憶體 (Memory)
  3. 輸入/輸出 (I/O)
  4. 檔案 (Information, File)
   
作業系統硬體與應用程式或使用者間,提供了三項主要功能
  1. 控制電腦系統資源
  2. 執行電腦程式
  3. 管理資料
   
作業系統是由一組程式所構成的軟體,是電腦系統的核心與基石, 這組程式控制協調著應用軟體以及 硬體設備的正常運作,同時也提供了人類與機器之間的溝通介面。 透過作業系統,電腦才能夠接受使用者所下達的指令,進而控制 各種硬體設備、執行運算,完成使用者所要求的工作。
   
作業系統身負諸如管理與配置記憶體、決定系統資源供需的優先次序、 控制輸入與輸出裝置、操作網路與管理檔案系統等基本事務,此外還 須提供一個讓使用者與系統互動的操作介面。
Wed Jan 24 23:42:38 CST 2024 Untitled Document
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,都是適用的。
A Unix History Wed Jan 24 23:42:38 CST 2024 Untitled Document
Unix 的特色
 
移植性高
 
小而美的作業系統
 
多人多工
 
眾多的應用程式
 
可靠的安全性
 
良好的系統架構
Wed Jan 24 23:42:39 CST 2024 Untitled Document
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 的首選。
Wed Jan 24 23:42:39 CST 2024 Untitled Document
Linux 的特色
 
友善美觀的圖形介面
 
多重開機管理
 
多人多工系統
 
優異的網路能力
 
眾多的程式開發工具
Wed Jan 24 23:42:39 CST 2024 Untitled Document
人機介面設備 (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 的專家,基於工作效率之故, 很多人還是喜歡使用傳統的終端機人機介面。
Wed Jan 24 23:42:39 CST 2024 Untitled Document
終端機的控制
   
終端機將使用者鍵入的字元送入電腦主機,而電腦主機則將欲展示的字元送給 終端機請終端機展示在螢幕上。很自然的,這些字元都使用世界標準的ASCII 編碼。 但是除了字元編碼之外,還需要一些控制碼方能順利操作一個終端機。例如:
  1. 指定字元的展示位置
  2. 指定游標位置
  3. 清除螢幕
  4. 設定字元顏色
  5. 設定背景顏色
   
在Unix 推出使用之初期,各家終端機廠牌都有各自的控制碼,並無世界標準, Unix 裝在一部電腦之後,並不知道連上電腦的終端機是何型式,很多功能便 無法使用。像 vi 這種需要控制游標位置的編輯器便無法順利運作了。 因此,Unix 建了一個資料表,放在 /etc/temcap 或 /etc/teminfo,將各種型號的控制碼記錄於內。 使用者可將使用的終端機型號定義在環境變數 TERM 中,如此,終端機與電腦的互動才能順暢。 後來美國標準局雖然制定了一個 ANSI 標準,但為了支援市面上既存的各種終端機,作業系統 無法因此而簡化。
Wed Jan 24 23:42:39 CST 2024 Untitled Document
Login, Logout, and Session
Login
使用者要使用Unix之前必須在系統上先有帳號。 在login:訊息出現後,鍵入帳號名稱,然後輸入密碼, 完成login 的動作,進入 Unix。
Logout
要離開系統(logout)時,打入exit 指令或^D符號,
Session
從login 到logout 之間稱為一個 session。
Wed Jan 24 23:42:40 CST 2024 Untitled Document
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 的版本
Wed Jan 24 23:42:40 CST 2024 Untitled Document
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 文檔的結束符號。
Wed Jan 24 23:42:40 CST 2024 Untitled Document
Shell
Shell script (and all executables) as a system command
   
一個 shell script 可以呼叫另一個script 以及任何一個執行檔來執行, 使得他們看來像內建的系統指令。 我們常見的指令,ls, cat, cp, rm 等其實都不是內建指令,而是放在 某個目錄下的執行檔而已。 因此,shell 變成可以無限擴張的一個programming language。 (其實Shell的原始設計目的就是在安排各種執行檔的先後次序,只是功能 太強大了,其所能發揮的功能已經遠遠超過其原始設計目的。)
Wed Jan 24 23:42:40 CST 2024 Untitled Document
易混淆的錯誤訊息
File not found
   
一般的程式語言在執行時,最常見的錯誤訊息是 syntax error (語法錯誤), 但 Unix 使用者在下指令時,或執行一個 Shell script 時, 經常會得到 "file not found" 的錯誤訊息, 讓初學者誤解,造成程式設計者除錯的困難。
   
這是因為當Shell在剖析使用者所下的指令時,若得到的結果 不是一個內建指令的關鍵詞(例如:if, the, for, test, 等) 會將該指令當成一個外部指令,亦即,一個存在某個目錄下面的 執行檔。Shell會依照環境變數 PATH 所記錄的所有目錄逐一尋找符合名稱 的執行檔,若找到,就拿來執行,若全部目錄都找不到,只好 放棄,並送出一個 "file not found" 的錯誤訊息。
執行檔名稱與內建指令衝突產生的錯誤
   
執行檔的命名不可與內建指令相同,因為 shell 會優先執行內建指令。 當使用者無意中將一個執行檔命名為一個內建指令名稱時,Shell 不會去執行這個檔案,而是執行內建指令,因而發生錯誤。當發生這種 情形時,因Shell被騙了而走入叉路,所發出的錯誤訊息會誤導使用者。 程式設計師可能花很多時間都無法找到錯誤的真正原因。
Wed Jan 24 23:42:40 CST 2024 Untitled Document
初始化檔案 .profile
   
如同剛拿到一部個人電腦必須先進行很多設定的工作一樣, 使用者一進入系統之後, 必須進行初始化工作,例如環境變數的設定。 為了減少使用者的負擔,使用者可以撰寫一個 shell script 並命名為 .profile 放在根目錄。 Shell 在啟動時,會到使用者的根目錄去找 .profile 並執行它。 大部分的初階使用者無力自行設定環境,系統管理者通常會為所有 使用者設計一個標準的 .profile 預先放在使用者的根目錄。 進階使用者可以根據自己的需要自由改寫 .profile。 最常見的兩項動作是,增加 PATH 內的目錄路徑以及定義一些自訂的變數。例如:
b=$HOME/bin     #定義變數 b  
export b       #將變數 b 變成環境變數 (全域變數)  
PATH=$PATH:$b     #將路徑 $HOME/bin 加入 環境變數 PATH 中  
如此,使用者就可將各種執行檔集中放在 $HOME/bin 之下,使用者無論在 哪一個目錄工作,都可以呼叫這些執行檔。此外,使用者若欲跳到 $HOME/bin, 可用下法直接跳過去。
cd $b
Wed Jan 24 23:42:41 CST 2024 Untitled Document
Environment Variable (環境變數)
   
環境變數類似全域變數, 但不同於一般的全域變數, 環境變數可以存活到子程序中。但子程序中對環境變數作的變更 在子程序結束時就作廢,不會影響到該變數在母程序中的值。
   
當你輸入set 指令,你會看到一些幾個重要的環境變數,例如:

環境變數 意義
HOME
這個變數記載使用者的根目錄。 (本文稱此目錄為該使用者之根目錄或$HOME), 使用者可以在這個目錄下放置任何檔案及子目錄。 一般的系統習慣是將進入系統的使用者放到他的根目錄, 使用者Login 後,將發現他正在這個目錄之下。 當然,系統管理者或使用者可以透過各種方式改變之。
PATH
這個變數記載系統及使用者的執行檔所在之目錄。 使用者所下之指令,如非shell 的內建指令, 則shell會將該指令視為一個執行檔之檔名而設法抓來執行。 而執行檔可以放在許多不同的目錄下, shell 會根據 PATH 這個變數所記載的目錄(各目錄間用冒號':'隔開, 而空字串代表現在之目錄 current directory) 逐一尋找使用者所下的指令之執行檔。
TERM
這個變數記載使用者現在使用的終端機型號,最常見者為vt100、vt102 、ansi。而對應到各型號之終端機控制參數通常放在 /etc/termcap (或 /etc/terminfo) 這個檔案內。
 
環境變數之設定
   
使用者可以任意以shell指令之方式任意設定環境變數的內容,例如:
TERM=vt100
PATH=$HOME/bin:$PATH
export TERM PATH
Wed Jan 24 23:42:41 CST 2024 Untitled Document
Some Tips with .profile
幾個環境變數的使用技巧
 
將常用的目錄定義於環境變數中
   
Unix 的重度使用者常常需要在各種不同的目錄跳來跳去,非常繁瑣, 也浪費時間,類似於視窗系統中,將某些 folder 設為捷徑,使用者可以將 將去的或常使用的目錄定義於環境變數中, 以方便變換目錄之檔案,使用起來非常方便。 例如:
bin=$HOME/bin #定義bin 變數為 $HOME 下面的 bin directory
ls $bin # 列出 $HOME/bin 內的檔案
cat $bin/file # 將 $HOME/bin/file 抓出來看
cd $bin # 跳至 $HOME/bin 之內
 
將 $HOME/bin 包含在環境變數 $PATH 中
   
將使用者自行開發的 script及各種執行檔集中放在一個 目錄(例如 $HOME/bin),然後登記在 $PATH 環境變數中,以備 使用者在任何目錄都可以輕易使用這些 script 及 執行檔。
Wed Jan 24 23:42:41 CST 2024 Untitled Document
檔案系統介紹
檔案的概念
   
在Unix中免不了要處理一些文件,而這些一篇篇的文件我們就叫做檔案。 就像是一篇文章有它的標題一般,一份檔案我們也可以替它取名字, 在同一目錄下不同的檔案不可有相同的檔名, 在不同目錄下不同的檔案則可以有相同的檔名。
   
Unix 的檔案,不一定是文件,也可能是目錄,也可能是終端機,或其他硬體設備。 這是Unix 的重要 理念之一,他把很多硬體軟體物件統一用檔案來表示,很多硬體設備的操作,可以用 檔案的操作來取代,例如:要將一段文字呈現在其他使用者的螢幕上時,可以將 這段文字寫到代表那個終端機的檔案去。(其實這就是目前網路上極為 風行的即時訊息,LINE就是其中一種)。 假設代表某一個其他使用者的終端機的檔案是 /dev/tty98, 我們可用下列指令將檔案"myfile"的內容展現在他的終端機上:
cat myfile > /dev/tty98
   
註:由於安全的問題,現在的多人使用 Unix 系統都將讀寫的權限關閉,只有 Super user 可以執行這樣的動作,但同一使用者所開的不同終端機之間還是 可以執行此類動作。
   
Unix的檔案系統呈樹狀結構,包含了目錄(Directory)和檔案(file) 。
Wed Jan 24 23:42:41 CST 2024 Untitled Document
檔案系統介紹 - 目錄(Directory)
   
如果所有檔案都放在一起,一旦檔案一多,無論查看、管理起來都很麻煩。這 個時候就有目錄的概念產生(就是我們俗稱的資料夾):我們可以把相同性質的檔案放在同一個目錄下。 一個目錄下面可以包含許多檔案或目錄,相對於某個目錄,其下層的目錄稱為 "子目錄" (subdirectory) ,它們也都具有相 同性質。由這些目錄所構成的一層層分枝,看起來就像一棵樹,所以才叫樹狀 結構,而最上面的目錄稱作"根目錄"。   (註: 本書為了遵從讀者的習慣,適當時機會採用資料夾這個翻譯,尤其是在 個人電腦上處理檔案時。)
   
這是檔案系統簡圖,很像一棵樹吧!
                         ┌ Joe  .....
                         │      ┌ Mail  ┬ joe
                         │      │       ├ Mary
              ┌─ users ┼ Tom  ┤       └ Eric
              │         │      └ dead.letter
              │         └ Mary ┬ Mail .....
              │                 └ ....
            / ┼─ bin ┬ ls
              │       ├ mail
              │       ├ rm
              │       └ cp
              └─ tmp
 
# 以下為螢幕顯示資訊,系統 Prompt 字元設為% 
#-------------------------------------------------------- 
%cd /   # 跳到根目錄 
%pwd # 檢視現在位於哪個目錄
/
%cd bin # 跳到根目錄下的 bin 目錄
%pwd # 檢視現在位於哪個目錄
/bin
%cd .. # 跳到bin 的上一層目錄
%pwd # 檢視現在位於哪個目錄
/
%
Wed Jan 24 23:42:41 CST 2024 Untitled Document
檔案系統介紹 - 工作目錄
   
使用者進入系統之後,系統會將使用者放在一個目錄下, 通常就是使用者自己的根目錄, 而這個目錄會記錄在 $HOME 環境變數中,使用者可以用 cd 指令來切換到任意的目錄, 而目前所在的目錄, 稱為工作目錄(Working directory),或當前工作目錄(Current working directory)、或當前目錄(Current directory)。使用者在下指令時, 系統會將工作環境設定在Current Directory。 再者,使用者可在此目錄之下,用相對檔名存取檔案。 例如:
指令 意義
pwd
列出目前工作目錄
cd dir1
跳到目前工作目錄的子目錄 dir1
cd /etc
跳到根目錄下之 etc 目錄
cd -
跳到先前的工作目錄
#-----------------------------------
如果使用者在兩個目錄間經常切換,那是很繁瑣的,
有了這個指令就很方便
   
對每一個目錄而言,"."這個符號代表現在這個目錄,而".."則代表現在目錄的上一層目錄。 例如:
指令 意義
ls ..
列出上層目錄的檔案
cd ..
跳到上層目錄
find . -print
列出目前工作目錄及所有的子目錄內所有檔案
Wed Jan 24 23:42:42 CST 2024 Untitled Document
檔案權限
   
每一個檔案,都附有不同的使用權限(permission)。使用權限分成讀、寫、 執行三種。一個檔案的擁有者(owner)可設定對不同類的使用者開放各種權限。 使用者分為三種,第一是擁有者 (owner)、第二為與擁有者同在一組的使用者(group)、 第三是其他使用者(others)。 以下是利用 “ls –l”指令以長格式列出所有檔案及子目錄。
# 以下為螢幕顯示資訊,系統 Prompt 字元設為% 
#-------------------------------------------------------- 
% ls -l
total 1059
drwx------  4 alex          512 Sep  6 14:54 Mail
drwxr-xr-x  2 alex          512 Oct 22 19:02 News
drwxr-xr-x  2 alex          512 Oct 29 16:05 games
-rw-------  1 alex         9915 Sep  6 14:55 mbox
drwxr-xr-x  4 alex         1024 Oct 27 20:54 xtype
-r-xr-xr-x  3 alex       925696 Au 28 14:48 xv
   
在每個檔案前有十個字元,第一個字元註記檔案形式,d 是目錄,- 是檔案。從第二到第十字元則註記使用權限,每三個字元為一組, 一共三組,每一組負責註記某一類使用者對於該檔案的使用權限。 每一組的三個字元分別註記<讀、寫 、執行>等權限的開放與否,以r、w、x表示開放, 以-表示關閉。第一組是 owner 的權限,第二組是group的權限,第三組是others的權限。
 
rw-------  #只有owner 可讀可寫
r-xr-xr-x  #所有使用者都可讀、可執行, 但都不可寫入(更動)
rw-r--r--  #owner 可讀可寫,其他使用者可讀但不能寫入
Wed Jan 24 23:42:42 CST 2024 Untitled Document
設定或改變檔案之使用權限
   
chmod 可用來改變檔案權限的指令,其格式如下:
 
   chmod <Mode> <filename> 
參數Mode讓使用者設定權限參數,有兩種格式讓使用者設定參數: 數字法使用三組八進位字元來設定權限,一個八進位數字等於 三個二進位數字,而每個二進位數字之'0'與'1'代表關閉或 打開對應的權限。 而符號法則使用符號來設定各類使用者之權限,基本用法如下: 第一個字元用'u','g','o','a'各自代表 'owner','group','other' 三類使用者及所有使用者(all), 第二個字元用'+','-'代表打開或關閉對應的權限, 第三個字元用'r','w','x'各自代表讀寫及執行三種權限。 例如 u+r 代表打開檔案擁有者的讀取權限,而 a-w 代表關閉所有使用者的寫入權限。 使用者可以一次下達數組指令,例如:
 
   chmod a-w,u+r filename
使用者也可以合併使用者類別,或權限類別,例如,
 
   chmod ug-w,u+rx filename
請參考下面兩個表:
 
數字法
八進位碼   二進位碼  
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
 
符號法
使用者類別 uuser(owner)
g group
o others
a all
使用權限類別 rreadable
w writable
x executable
 
指令 意義
chmod 777 testfile
對所有使用者開放所有權限
chmod a+r,a+x,a+w testfile
 同上
chmod a+rwx testfile
 同上
chmod 741 testfile
對擁有者開放所有權限,
對同組使用者開放<讀>的權限,
對其他使用者開放<執行>權限
chmod u+rwx,+r,o+x testfile
同上
Wed Jan 24 23:42:42 CST 2024 Untitled Document
檔案及目錄的命名
   
檔案的名字除了"/" 之外的字元都可以用來為檔案命名。檔案及目錄名字的 長度限制隨系統而定。檔案開頭是"." 的檔案是隱藏檔,用陽春的"ls"指令 是看不到這些隱藏檔的。得加上"-a" 參數才會列出隱藏檔。 不過,從很多痛苦的經驗中得到一個教訓是:最好不要用奇怪的特殊字元 (包括space)來命名以免自找麻煩。
   
微軟系統下的檔案名稱經常含有空白字元,國人也喜歡用中文檔名。 當要用Unix 處理這些檔案時,常因此種名稱導致非常不方便的結果。 建議盡量使用英文命名。
   
如果檔案名稱的第一個字元是"-"時, 要刪除或複製時都是很麻煩。例如,要刪除一個檔案"-myfile":
   rm –myfile
會失敗,因為 shell 會將"-"誤認為 option 的符號。遇到這種情形,可用
   rm -- -myfile
來達成目的。
Wed Jan 24 23:42:42 CST 2024 Untitled Document
檔案系統介紹 - 路徑 (PATH)
   
使用者或程式可以存取Unix 整個檔案系統內的任一檔案,如果要存取的檔案不在目前 工作目錄中時,使用者要如何抓到一個檔案? 最笨的方法是逐步切換工作目錄到包含該檔案的目錄下,再行存取,猶如在Windows系統中, 使用者要一層層逐步打開目錄一樣,非常麻煩。 另一個方法是使用路徑,由系統根目錄起 將一個檔案的所有上層目錄逐層全部列出來中間以'/' 隔開,即為該檔案的"路徑"。 路徑其實可以說是檔案的”全名”。 例如a目錄下的b目錄下的c檔案,其路徑就是 /a/b/c 。而路徑又分成以下 兩種:
絕對路徑
/a/b/c
路徑名稱以'/'開頭,而檔案或目錄的位置從根目錄算起。
相對路徑
a/b/c
路徑名稱不以'/'開頭,而檔案或目錄的位置從目前工作目錄算起。
Wed Jan 24 23:42:43 CST 2024 Untitled Document
檔案處理
   
Unix中大部分的工具程式多半以文字檔(類似微軟的 .txt 格式)為標的,極少使用特殊格式的檔案,因此檔案不會被任何工具程式所綁住, 而且各個程式很容易分享檔案,也容易像七巧板一般,將數個工具程式組合起來 合成一個新的功能。
   
文字檔案是一行行橫排的ASCII characters,行與行之間用<CR>或<NL> 分開。 而多半的工具程式是以行為處理單位的,例如head -100可抓到前100行的文 字,而grep pat testfile則把testfile中含有"pat"字串的「行」抓出來, 只有少數的程式可以處理(抓取)直行的資料(例如awk及cut)。
 
處理檔案的指令
指令 意義
ls
列出目錄的內容
ls -l
列出目錄的詳細內容
cd <dir>
切換工作目錄為<dir>
mkdir <dir>
建立名叫<dir>的目錄
rmdir <dir>
刪除名叫<dir>的目錄
cat <file>
看<file>的內容
more <file>
看<file>的內容,並且每印滿一頁後則暫停
rm <file>
刪除<file>
cp <fileA> <fileB>
把檔案<fileA>拷貝一份成<fileB>
cp -r <dirA> <dirB>
把<dirA>整個目錄拷貝一份成<dirB>
mv <fileA> <fileB>
將<fileA>改名為<fileB>
echo <string>
將<string>顯示在螢幕上
Wed Jan 24 23:42:43 CST 2024 Untitled Document
I/O轉向與管線 (I/O Redirection and Pipe)
標準輸入/輸出/錯誤 及I/O轉向 與 管線
   
一個程式在執行時常常需要從輸入檔讀進資料並將運算結果儲存在輸出檔中。 在Unix出現之前,傳統作業系統中, 一個程式的輸出檔與輸入檔的檔名都是寫死在程式中的, 非常難以改變。 Unix做了一個革命性的改進,除了提供傳統的輸出輸入方式之外,還額外提供 了一個方法讓使用者可以任意改變輸入輸出的標的。 Unix 定義了標準輸入檔及標準輸出檔,只要一個程式 從標準輸入檔讀進資料並將運算結果儲存在標準輸出檔中,使用者就能運用 I/O 轉向將輸入或輸出導向任意的檔案。 標準輸入檔的預設值是鍵盤,而 標準輸出檔的預設值是螢幕。 例如: 'ls'這個指令的輸出是螢幕,將一個目錄內的全部或部分檔案名稱列在螢幕上。 但如果要將'ls'這個指令的執行結果放入一個檔案,便可以用下法:
    ls *.jpg > myfile
  #=============================================
  #將所有jpg檔列出,寫入到 "myfile" 這個檔案。
在上例中,'>' 是輸出轉向,系統會開啟一個新檔,"myfile", 若該檔案原就存在,則內容會先被清除。 如此方便高度彈性的特性,是Unix 之所以如此好用的原因之一。
對比於我們常用的視窗系統,要將一個資料夾內的檔案名稱存入一個檔案中, 沒有方便的方法。
   
Unix 系統主動為每一個程序(Process)預設開啟三個檔案: 標準輸入(檔案代碼為 0),預設連結到鍵盤;標準輸出(檔案代碼為 1),預設連結到螢幕;標準錯誤(檔案代碼為 2), 通常也是預設連結到螢幕。
名稱 簡稱 File Descriptor
標準輸出
STDIN
   0
標準輸入
STDOUT
   1
標準錯誤輸出
STDERR
   2
   
使用者可以改變預設的連結到其他檔案。
 
更改標準輸入(STDIN) "<"
   
在指令後方加"< myfile" ,
即可從"myfile"這個檔案輸入資料。
 
更改標準輸入(STDIN) "<<"
   
在指令後方加"<<" ,
即可將之後的字串當作標準輸入讀取資料。
請參考下節的說明。
 
更改標準輸出(STDOUT) ">"
   
在指令後方加"> myfile" ,
即可將螢幕輸出的資 料導向到"myfile"這個檔案上。
 
更改標準輸出(STDOUT) ">>"
   
在指令後方加">> myfile", 功能與”>”相似,
只不過這會將資料加在檔案 "myfile" 的後面。
# 以下為簡單的輸出轉向的例子,系統 Prompt 字元設為%
#-------------------------------------------------------- 
%echo test > testfile
%cat testfile
test
%echo TEST > testfile
%cat testfile
TEST
%echo test >> testfile
%cat testfile
TEST
test
% 

#--------------------------------------------------------

可以看到第二個echo 將第一個 echo 的執行結果覆蓋掉了, 而第三個echo 卻保留了第二個 echo 的執行結果。
   
標準錯誤輸出(STDERR, standard error), 用來顯示錯誤訊息,如果標準輸出(STDOUT)已經被轉向到一個檔案去, 我們還是可以從螢幕上看到錯誤訊息。 在 Bourne Shell (sh) 及 Korn Shell (ksh) 中, 可以使用"2>"符號把它轉向到另一個檔案, 當然也可以將 STDOUT 及 STDERR合併轉向到同一檔案去。
 
合併標準輸出(STDOUT)與標準錯誤輸出(STDERR)
   
當撰寫一個電腦程式時,在除錯的過程中, 經常要將錯誤資訊儲存起來慢慢分析,如前所述可用 2> 將標準錯誤輸出(STDERR)轉向到一個檔案,如果 要合併標準輸出(STDOUT)與標準錯誤輸出(STDERR)並且存到 一個檔案時,就需用到
command 2>&1 > myfile
這樣的方式。 其中 >& 這對符號其實就是 > 的特殊表示法, 其後面不是接著一般檔名,而是檔案編號,因而要用這對特殊符號。
Wed Jan 24 23:42:43 CST 2024 Untitled Document
輸入轉向
輸入轉向
   
當一個程式需要從鍵盤輸入資訊,但不想麻煩使用者跟系統作互動性輸入時, 可用I/O轉向法達到目的。 先將需要由鍵盤打進去的資料放在一個檔案內,再用輸入轉向請程式改由這個檔案讀取資料。
利用輸入轉向自動編輯檔案
   
當我們要重複編輯一批檔案時,可以利用輸入轉向自來動編輯檔案。 可以節省大量繁瑣的編輯工作。 (不適用螢幕編輯器 screen editor,例如 vi 或 emacs)。 先將編輯器的編輯指令放進一個檔案(例如s.o), 然後利用輸入轉向讓Shell 自動編輯文件。
 
例如我們要使用 ex 編輯器來刪除一個段落(第10行到第20行)時, 須下一個如下的 ex 指令:
10,20d
w
如今希望在一個 shell script 中進行一個自動編輯的動作, 在編輯時使用者不須介入。
 
方法一: 雙檔案方式
   
第一種方法是先將編輯指令存放在另一個檔案內,例如 s.o,再用I/O轉向來取代鍵盤輸入,script 如下:
ex  file < s.o
將上面的script放在一個迴圈內,一次就能編輯所有的文檔:
for i in *.txt
do
  ex $i < s.o
done
如此可以節省大量的辛苦編輯工作。
但是這個方法需要額外建一個 s.o檔案,增加檔案管理的負擔。而 方法二則不須另建檔案。
 
方法二(Here): 單一檔案方式
   
方法二是直接在一個script中利用另一種輸入轉向,簡稱 Here 法, 將編輯指令直接餵給 ex, 例子如下:
ex file <<%
10,20d
w
%
其中,'%' 可以是任意字元,只要前後匹配即可。
後面的符號('%')必須單獨佔用一行,且必須是該行第一個字元。
   
方法二的優點是不須額外建一個儲存編輯指令的檔案, 檔案管理較為單純。 但是有兩個缺點。
  1. 當編輯指令很複雜很多行時,整個 script 混雜shell 的指令以及ex 的指令, 使得整個 shell script 的可讀性降低,不如方法一簡單。
  2. 編輯指令常使用特殊符號,而特殊符號可能與 Shell 語法衝突,造成困擾。因為整個 script 先由Shell剖析,再交給ex 執行,Shell 在進行剖析時, 會將所有特殊符號當成 Shell 的特殊符號處理。 例如下面的 ex 編輯指令在使用此法時,就須特別注意。
    ex file <<%
    10,$d
    w
    %
    
    其中的 '$' 符號,原是ex 中的符號,代表最後一行,但 Shell 會將他當成變數符號而試圖展開,造成錯誤。正確的寫法如下:
    ex file <<%
    10,\$d
    w
    %
    
 
方法三 (方法一的改良版)
   
方法三是直接在一個 shell script中利用 echo (或其他程式) 將編輯指令存放在另一個檔案內,再用I/O轉向來取代鍵盤輸入, 此法是方法一的改良版,只需要一個檔案,管理比較簡單, shell script 如下:
echo "10,20d
w" >> s.o
ex file < s.o
Wed Jan 24 23:42:43 CST 2024 Untitled Document
Pipe
管線(Pipe)
   
"|" 是 Pipe 的符號,就像一根管子一般將左右 兩邊指令的輸出和輸入連接起來。 左邊指令的輸出,會當作右邊指令的輸入。
#-------------------------------------
#列出使用者'clinton'所有正在執行的程式 
#------------------------------------- 
who | grep clinton
   
在沒有 Pipe 這種機制之前,使用者只能將一個指令或程式執行的結果 暫時存在一個暫存檔,再執行另一個指令(程式),而將暫存檔內的資料 餵給第二個指令作為它的輸入。非常繁瑣也不利於程式的閱讀, 尤其是當執行步驟很多時,更為頭疼。
 
I/O Rediction 及 Pipe 這兩種 機制在程式設計上具有高度的彈性,也是Unix 在早期普受歡迎的原因之一。
 
要訣: 利用 Pipeline 組成接力賽團隊,逐步完成任務
   
將一個個 Unix 指令、小工具、script等以接力方式串接起來, 共同完成一個任務,就像接力賽跑一樣。
Wed Jan 24 23:42:44 CST 2024 Untitled Document
程序 (Process)
   
一個正在執行中的程式,我們稱做 process (程序)。 Unix是多工的系統(multitasking), 可以同時執行多個程式,讓多人同時使用系統,執行程式,或讓同一個人 同時執行數個程式,例如,要「跑」一個非常耗時 的演算法程式,又要同時進行其他的工作。 但,Unix 是設計給終端機前的使用者使用的,而終端機只有一付鍵盤, 那要如何讓使用者同時執行數個程式呢? 這就要藉助於所謂的 foreground (前景) 與 background (背景) 概念了。
   
執行程式之方式可分為兩種: 前景執行(foreground)和背景執行(background)。 前景程式可以接受鍵盤輸入,但背景程式則否。 使用者在鍵盤所打進的資料,全部會送到前景程式。 一般人在絕大部分的情況下,所面對的前景程式就是 shell。
   
如何將程式放入背景去執行﹖只要在指令後面加上"&" 就行了。 系統會傳回"[n] xxxx"的訊息,n 是job id, xxxx是process id。每一個process 都有 process id,而且不會有重覆。 使用者可以根據 process id 來控制它, 例如,可用下列指令強迫結束一個背景程式:
kill 〈process-id〉 
#--------------------------------------------------------
#註: 可用 ps 指令列出所有執行中的 process 及其 process id 
   
要想停止前景執行的程式,可以按<Ctrl-C>中止,若是想暫停一下,可以按 <Ctrl-Z>暫時停止執行,要恢復執行可以用 f 或 bg 來決定前景或背景執行。
# 以下為螢幕顯示資訊,系統 Prompt 字元設為%
#-------------------------------------------------------- 
%myprogram&
[1]  5678
%
 
多視窗系統中的懶人法程序管理
   
Unix 程序的管理雖然不難,但不熟練的初學者還是很麻煩,如果是在 多視窗的系統下,可以開設多個虛擬 Unix 程序,好像是多個終端機 一般,就不需要繁複的程序管理了。要結束一個停不下來的程序,只須 關掉其所在的視窗就行了。
Wed Jan 24 23:42:44 CST 2024 Untitled Document
背景執行相關指令
 
背景程序之被迫終止
   
放在背景執行的程序,在使用者結束 session 而 logout 之後, 背景的程序都會立刻被殺掉。這樣做是避免粗心的使用者遺忘了背景 程序而佔用系統資源,尤其是當有些錯誤的程序可能會進入無窮迴圈時, 更是系統的大敵,因此 Unix 會自動殺掉無主的背景程序。
 
防止背景程序之被迫終止
   
但是使用者可能會執行一些耗時很久的程序,又不想佔用終端機時,可以 使用 nohup 來讓某個背景程序拒絕接受作業系統的中止信號, 因而不會被迫終止。例如:
nohup myscript  > outfile  &
Wed Jan 24 23:42:44 CST 2024 Untitled Document
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的對應如下:
Ctrl+C
2
Ctrl+\
3
Ctrl+Z
20
Wed Jan 24 23:42:44 CST 2024 Untitled Document
FreeBSD Signals
Signal Name Signal 說明
SIGHUP
1
Terminal line hangup
SIGINT
2
Interrupt program
SIGQUIT
3
Quit program
SIGILL
4
Illeal instruction
SIGTRAP
5
Trace trap
SIGABRT
6
Abort
SIGEMT
7
Emulate instruction executed
SIGFPE
8
Floatin-point exception
SIGKILL
9
Kill program
SIGBUS
10
Bus error
SIGSEGV
11
Segmentation violation
SIGSYS
12
Bad argument to system call
SIGPIPE
13
Write on a pipe with no one to read it
SIGALRM
14
Real-time timer expired
SIGBBTERM
15
Software termination signal
SIGURG
16
Urent condition on I/O channel
SIGSTOP
17
Stop signal not from terminal
SIGTS0TP
18
Stop signal from terminal
SIGCONT
19
A stopped process is being continued
SIGCHLD
20
Notification to parent on child stop or exit
SIGTTIN
21
Read on terminal by background process
SIGTTOU
22
Write to terminal by background process
SIGIO
23
I/O possible on a descriptor
SIGXCPU
24
CPU time limit exceeded
SIGXFSZ
25
File-size limit exceeded
SIGVTALRM
26
Virtual timer expired
SIGPROF
27
Profiling timer expired
SIGWINCH
28
Window size changed
SIGINFO
29
Information request
SIGUSR1
30
User-defined signal 1
SIGUSR2
31
User-defined signal 2
SIGTHR
32
Thread interrupt
Wed Jan 24 23:42:45 CST 2024 Untitled Document
Solaris Signals
Signal Name Signal 說明
SIGHUP
1
Hans up
SIGINT
2
Interrupts
SIGQUIT
3
Quits
SIGILL
4
Illegal instruction
SIGTRAP
5
Trace trap
SIGABRT
6
Used by abort
SIGEMT
7
EMT instruction
SIGFPE
8
Floatin-point exception
SIGKILL
9
Kill (cannot be cauht or ignored)
SIGBUS
10
Bus error
SIGSEGV
11
Sementation violation
SIGSYS
12
Bad arument to system call
SIGPIPE
13
Writes on a pipe with no one to read it
SIGALRM
14
Alarm clock
SIGBBTERM
15
Software termination
SIGUSR1
16
User-defined signal 1
SIGUSR2
17
User-defined signal 2
SIGCHLD
18
Child status change alias (POSIX)
SIGPWR
19
Power-fail restart
SIGWINCH
20
Window size change
SIGURG
21
Urgent socket condition
SIGPOLL/SIGIO
22
Pollable event occurred or Socket I/O possible
SIGSTOP
23
Stop (cannot be caught or ignored)
SIGTS0TP
24
User stop requested from TTY
SIGCONT
25
Stopped process has been continued
SIGTTIN
26
Background TTY read attempted
SIGTTOU
27
Background TTY write attempted
SIGVTALRM
28
Virtual timer expired
SIGPROF
29
Profiling timer expired
SIGXCPU
30
Exceeded CPU limit
SIGXFSZ
31
Exceeded file size limit
SIGWAITING
32
Process' LWPs are blocked
SIGLWP
33
Special signal used by thread library
SIGFREEZE
34
Special signal used by CPR
SIGTHAW
35
Special signal used by CPR
SIGCANCEL
36
Thread cancellation signal used by libthread
SIGLOST
37
Resource lost
SIGRTMIN
38
Hihest priority real-time signal
SIGRTMAX
45
Lowest priority real-time signal
Wed Jan 24 23:42:45 CST 2024 Untitled Document
File Name Expansion (Wildcard 萬用字元)
 
檔名自動展開 (File Name Expansion)
   
為避免鍵入冗長的檔案名稱,Unix 讓使用者使用一些特殊符號來簡化一個或一批檔名。 當一個使用者下達一個牽涉到檔案名稱的指令時, 系統會找出所有符合這個名稱的檔案, 例如'ls A*jpg',系統會列出當前工作目錄下檔名為A開頭而以jpg 結尾的所有檔案。 這些特殊符號有人稱之為「萬用字元」(Wildcard/meta character)。 以下是常用的三種萬用字元:
符號 意義
*
代表任意長度的字串
?
代表任何的單一字元
[...]
代表區間內定義的任一字元
   
例如:
符號 意義
c*
代表cat ,cp ,cal ...任意長度且開頭為c 的檔案。
ca?
代表cat,cal ...三個字且前二字為ca的檔案。
ca[a-z]
代表caa,cab,caz ... 三個字且頭二字為ca第三字為a到z的檔案。
   
當執行下列指令時:
 cd /bin
 ls -al
系統將會列出好多執行檔,如果你只想找"p" 開頭的檔案,可以鍵入
 ls p*
 
Tilde Expansion
   
有些版本的 Unix 系統,另有一種萬用字元 "~"加在使用者名稱之前, 可代表該使用者的 $HOME 目錄, 例如:
~clinton        # 使用者 clinton 的 $HOME 目錄 
在不同使用者之間複製、移動、或取用檔案非常方便。例如:使用者 clinton 寫了一個很好用的 shell script, "cmd", 放在他的$HOME/bin 欲分享給其他使用者,其他使用者不需知道該使用者所在的絕對路徑,即可用
~clinton/bin/cmd 
來使用這個 script。
   
對同一個使用者而言,"~" 等於是 $HOME,例如:
cp ~/bin/cmd  $HOME      # 將 $HOME/bin/cmd 複製到 $HOME 目錄 
Wed Jan 24 23:42:45 CST 2024 Untitled Document
終端機的設定
   
如先前說明的,使用者必須設定終端機型號,才能使用很多功能。
   
在csh及tcsh中可利用下列指令設定:
   set term = vt100
   
在sh, bash, ksh, zsh 中可利用下列指令設定:
   TERM=vt100
   export TERM
 
利用 stty 可以設定終端機輸入時的控制指令
   
利用下列指令設定編輯按鍵:
stty erase '^H' kill '^C' 
設定結果如下:(沒有設定的則是預設值)
erase
^H (Backspace) or DEL
kill
^C
^D
End of File, End of Input
Flow
Control
^S #暫停螢幕輸出 (Xon)
^Q #恢復螢幕輸出 (Xoff)
Wed Jan 24 23:42:45 CST 2024 Untitled Document
編輯器 (Editor)
 
編輯器 (Editor)
   
Unix 提供數種編輯器給使用者編輯文件及程式。早期沒有 CRT螢幕終端機時,最風行的是 IBM 的打卡機及讀卡機,使用者 將指令一一在卡片上打洞,每一張卡片打一行指令,這是當時最風行的輸入 裝置。讀者在考試時,使用 2B 鉛筆塗抹答案卡,就是這種輸入裝置的一種 形式。
後來使用沒有CRT 的 TTY作為輸入裝置,再進化成 CRT 螢幕終端機, 第一代的 CRT 螢幕終端機,只是單純的取代 TTY,並沒有游標操縱的能力,所有的資訊是一行一行的展現在螢幕底端, 新的一行將舊的一行往上擠,其游標是無法操縱的。 因此這個時期的終端機是無法使用像 vi 這種需要控制游標的編輯器,只能使用列編輯器。
 
列編輯器(line editor)
   
Unix 提供數種基本的列編輯器,e, ed, 以及 ex。 使用者鍵入指令或資料,按Enter, 系統按指令執行編輯動作。 在更動檔案中某一行的錯誤時,使用者的標準動作是:
  1. 令編輯器印出所欲更動的區間,如
    143, 160p       #印出143行到160行 
  2. 令編輯器進行更動,如:
    145s/nccu/NCCU/       #將第145行中的 nccu 改成 NCCU 
    160d                  #將第160行刪除 成 NCCU 
用列編輯器編輯檔案是很痛苦的事,但比起打卡而言,已是一大進步。
 
列編輯器還有沒有用????
   
現在已經有了更好用的編輯器,更有 Word 這種超級編輯器, 那超級難用的列編輯器還有沒有用? 讀者也許很驚訝,列編輯器不但還有用, 而且還有大用。想看看,在shell script 自動執行中, 如果有編輯文字的需要,怎麼辦? 只能靠這種能閉著眼睛執行編輯指令的列編輯器了。 筆者數十年來寫出數以萬計的 script 中絕大部分會用到列編輯器。
 
可視化編輯器 (Visual Editor)
   
vi 及 emacs 是 Unix 最風行的兩個可視化編輯器,使用者可以操縱 螢幕上的游標,對游標所指的地方進行編輯。 當然,使用這種編輯器的先決條件是要有一個能操縱游標的 CRT 螢幕。(現在都由個人電腦上的虛擬終端機取代了)。
Wed Jan 24 23:42:46 CST 2024 Untitled Document
任務控制 (Job Control)
   
因為Unix是多人多工的作業系統,所以在同一時間內會有許多程式同時執行。我們 稱每一個正在執行的程式叫做 程序 (process) 。對作業系統而言,每一個 程序是使用者交付的 任務 (Job)。 一個使用者也可以同時交付很多個任務。以下是控制任務 (Job)的指令:
指令 意義
^Z
暫停執行 (suspend)
fg
將最近一次送出的背景程序轉到前景執行
fg %3
將第三個任務轉到前景執行
ps
列出現在正在執行的任務之 process id (pid)
kill <pid>
強迫終止一個 process 之執行。
某些process 不受此指令之影響,例如 login process就不受本指令之影響 (否則使用者將被強迫log out)。 kill 指令只能控制從相同終端機所執行的背景程式, 如果使用者同時用數個終端機時,從不同的終端機所下的指令或背景程序 則不受本指令之影響。
kill -9 <pid>
強迫結束執行一個 process,
本指令可以強迫結束某些不受上一個指令影響之 process,包括從 不同終端機所下的指令及背景程式,也可以將login process 殺掉,將 使用者踢出系統,強迫log out。
kill -9 -1
把所有屬於自己的程式清光,全部結束執行。
本指令會把使用者結束,踢出系統,強迫log out, 如果使用者同時用數個終端機時,本指令會將所有的 login process 全部結束。
kill -9 0
與 kill -9 -1 相同
Wed Jan 24 23:42:46 CST 2024 Untitled Document
命令列的編輯
命令列的編輯 (Command-line editing)
   
相對於視窗系統用滑鼠點擊就能作事, 使用命令列操作電腦的系統都有一個惱人的問題: 就是要敲很多很多鍵盤來作事。 當需要重複下達相同或類似指令時, 如果能重複使用或修改先前所下過的指令的話, 那可就功德無量了, 命令列編輯種種功能就是讓使用者找回 先前所下過的指令加以修改使用。Korn Shell, C shell, Bash Shell等都有這種功能。以 Korn Shell 為例,ksh 會記錄先前所下過的指令,使用者可以用 ESC 進入命令編輯模式將記錄下的指令當成一個檔案, 利用預設的編輯器搜索所要重複使用的指令並進行編輯, 再送給Shell去執行。 使用者可以設定 VISUAL 環境變數指定喜歡的編輯器。
Wed Jan 24 23:42:46 CST 2024 Untitled Document
指令介紹
Unix 常用指令如下:
指令 意義
man <cmd>
see the manual page of <cmd>
who
who is loged in, and what are they doing
du
check disk usage (size of subdiretories)
pwd
print working directory name
cd <dir>
change the working directory to another directory
cd
change working directory to your home directory
cut
extract columes from a file
ls
list the content of a directory
cat <file>
catenate and display a file
more <file>
display a file page-by-page
echo <string>
display a string
cp <file1> <file2>
copy a file to another file
rm <filename>
remove a file
rm -r <dir>
recursively remove a directory
mv <file1> <file2>
rename a file or directory
mv <files> <dir>
move multiple files to the directory <dir>
mkdir <dir>
create a new directory
paste <file>
merge files horizaontally into a muiti-colume file
rmdir <dir>
remove an empty directory
chmod <mode> <file>
change the permission mode of file
sort <file>
sort a file
kill
terminate a (or more) process
ps
list all of your process
Wed Jan 24 23:42:46 CST 2024