Classic Shell Scripting 讀書筆記 (六)
文件與文件系統
簡單來說,文件是計算機系統裡的一堆數據,可以用單一實體的方式被引用
文件命名
原始的 UNIX 文件系統設計者,決定將ASCII 256 個元素集合都可用於文件名,但有兩個例外:
- 控制字符
NUL
(此字符所有位址皆為0),這是許多程式語言用來表示字串結尾的字符 - 斜槓(
/
)字符
最好考慮加上以下限制:
- 是可視字符
- 避免使用 Shell 的 meta 字符,也就是大部分的標點符號
- 避免用連字號開頭,看起來像是 UNIX 的命令選項
UNIX 文件名是 Case Sensitive,慣用小寫,除了重要文件會用大寫或大小寫混用,如 README
、Makefile
,原因是在 ASCII 裡,大寫排在小寫之前,會列在前方(現行系統排序則是參考 locale)
命名長度普遍允許使用到 255 個字符,POSIX 中定義 NAME_MAX
來限制其長度
ASCII
1963 年,美國標準學會以 American Standard Code for Information Interchange 名稱提出 7 位元的字符集,允許 128 個不同字符。
7 位元對世界語言是不夠的,由於現在系統都使用 8 位元作為最小定址儲存單位,允許 256 個不同字符,前半段被拿來客製化,後半段留給 ASCII,在未遵循國際標準的情況下,也因此出現了幾百種不同的字符指定方式,或稱內碼頁(code page)。
8 位元對歐洲語系仍是不夠的,因此 ISO 為此開發了一系列的代碼頁。
90 年代,單一萬國字符集 Unicode 開始運作,所有字符最終需要大約 21 個位元。由於許多操作系統只使用到 16 個位元,UNIX 系統使用一個可變動的位寬度編碼: UTF-8,允許已存在的 ASCII 文件成為有效的 Unicode 文件。
文件裡有什麼
以另一個觀點來看,UNIX 文件不過是 0 個或多個不知名數據字節所集結而成的字節流
複製一個文件:
1 2 3 4 5 6 7 |
try-to-get-a-gyte while (have-a-byte) { put-a-byte try-to-get-a-byte } |
許多工具設計上使用「大的但大小固定」的緩衝區來保存文本行,如果輸入過長的行,可能導致錯誤,建議長度限制在易讀的範圍,例如 50-70 個字符
所有文件被視為是二進制文件:每一個包含在其中的字節,都有 256 種可能的值。
文本文件(有分行的文本)可視為二進制文件的子集,以 ASCII linefeed (LF) 表示行的界線,也就是換行字符,在程式語言通常以 \n
來表示(比起 Windows 使用一組 carriage-return/linefeed 簡單多了)
文件中會保留字節數的計數,當嘗試讀取超越此計數時,返回 end-of-line 的暗示,因此不可能看到任何磁盤區塊之前的內容
文件系統架構
UNIX 文件系統是可嵌套的樹狀結構,目錄使用 directory 而非 folder(偏向紙本的),結構的根源為根目錄,使用特殊名稱 /
當目錄底下有過多的文件,應該以子目錄重新組織,提昇查找效率
文件名完整路徑長度沒有特殊限制,POSIX 中定義 PATH_MAX
來限制其長度,通常為 256 個字符
UNIX 目錄本身就是文件,但擁有特殊屬性且有特定訪問方式
所有 UNIX 目錄,就算是空的,也總是包含兩個特殊目錄: ..
(父目錄) 及 .
(當前目錄本身),根目錄的父目錄就是自己(/
、/..
是一樣的)
路徑結尾若以斜槓 /
結束,則該文件是一個目錄,沒以斜槓結尾,不一定不是目錄
WWW 的 URL 結構就是 UNIX 風格的
層級式文件系統
UNIX 允許將某個文件系統,邏輯性地放置於令一個文件系統的任意目錄之上,稱為掛載(mounting)
掛載的相關細節,除存在一個特殊文件中,通常為 /etc/fstab
或 /etc/vfstab
有些掛載/卸載需要特殊權限,有些則允許非特定用戶也可以操作,如 CD-ROM、隨身碟
Index Node (inode)
文件系統建立時,一個管理原指定的固定大小表格也隨之建立,稱為 inode
inode 包含了系統辨識文件時所需的 metadata,但文件名不包含在內,文件名保存在目錄裡:
- 列出目錄下的文件時,不須多次查詢 inode
- 一個 inode 編號可以對應到多個文件名,也就是 UNIX 中的連結(link)功能
inode 所保存的訊息包含文件的: 1) inode 序列號 2) 類型 3) 連結 4) 大小 5) 權限 6)時間戳
當一個物理文件,其有多個名稱時(代表至少存在一個連結),哪一個才能刪除物理文件?——
inote 表包含了連接到文件的計數,當計數為 0,文件區塊最終才會重新指派給可用空間的列表
軟連接與硬連接
同一個文件系統下的連接,指向的是 inode 編號(hard-link),但連結跨越文件系統時,inode 會紀錄該文件類型是符號連接/軟連接(symbolic/ soft link),指向的是「一個 UNIX 路徑」而非 inode 編號
為了避免早成死循環,目錄通常不能有硬連接,除了 .
與 ..