.\" Copyright (c) 1998 Andries Brouwer .\" .\" This is free documentation; you can redistribute it and/or .\" modify it under the terms of the GNU General Public License as .\" published by the Free Software Foundation; either version 2 of .\" the License, or (at your option) any later version. .\" .\" The GNU General Public License's references to "object code" .\" and "executables" are to be interpreted as the output of any .\" document formatting or typesetting system, including .\" intermediate and printed output. .\" .\" This manual is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public .\" License along with this manual; if not, write to the Free .\" Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, .\" USA. .\" .TH GLOB 7 "12 June 1998" "Unix" "Linux Programmer's Manual" .SH NAME glob \- 形成路徑名稱 .SH "描述 (DESCRIPTION)" 很久以前 在 UNIX V6 版 中 有一個 程序 .I /etc/glob 用來 展開 通配符模板. 不久以後 它 成爲 shell 內建功能. 現在 人們 開發了 類似的 庫函數 .BR glob (3), 讓 用戶程序 實現 同樣的 功能. 此 規則 遵循 (POSIX 1003.2, 3.13). .SH "通配符匹配 (WILDCARD MATCHING)" 包含 '?', '*' 或 '[' 字符的 字符串 稱爲 通配符模板(wildcard pattern). 形成路徑名(globbing) 指 一種 操作, 把 通配符模板 展開爲 匹配 該串的 路徑名. 匹配 定義爲: 不在 方括弧中 的 '?' 匹配 任意 單個 字符. 不在 方括弧中 的 '*' 匹配 任意 字符串, 包括 空串. .SS "字符集 (Character classes)" 對於 表達式 `[...]', 如果 在 第一個 '['符 後面 出現的 第一個 字符 不是 '!', 則 該 表達式 匹配 任意 一個 在 `[...]'內 出現的 字符. 方括弧內 不能 有 空串, 因此 ']' 可以 作爲 第一個 字符 出現在 方括弧內. (像 這樣, '[][!]' 匹配 下列 三個 字符 中的 任意 一個, '[', ']' 和 '!'.) .SS "範圍集 (Ranges)" 字符集 有一個 特例: 用 '-' 分開的 兩個 字符 表示 一個 範圍集. (像 這樣, `[A-Fa-f0-9]' 等於 `[ABCDEFabcdef0123456789]'.) 把 '-' 放到 方括弧內 的 開頭 或 最後 可以 獲得 它的 本意. (像 這樣, `[]-]' 匹配 ']'和'-' 中 任意 一個. 而 `[--/]' 匹配 `-', `.' 和`/'中 任意 一個.) .SS "補集 (Complementation)" 表達式 '[!...]' 表示 一個 字符, 該 字符 不匹配 方括弧內 去掉 開頭 '!' 後 的 表達式. (像 這樣, `[!]a-]' 匹配 除了 ']', 'a' 和 '-' 的 任意 一個 字符.) 要 去掉 '?', '*' 和 '[' 的 特殊 含義, 可以 通過 前面 加 一個 反斜槓; 或者 在 shell 命令行 中, 通過 引號 來 引用 這些 字符. 在 方括弧內 這些 字符 顯露出 本意, 所以, '[[?*\e]' 匹配 這 四個字符 中 的 一個: '[', '?', '*', '\e'. .SH "路徑名 (PATHNAME)" 形成路徑名 功能 應用於 路徑 中 的 每一個 成員部分. 路徑 中 的 '/' 不能 被 通配符 '?' 或 '*', 或 範圍集 如 '[.-0]' 匹配. 範圍集 不能 直接 包含 '/', 否則 導致 語法錯誤. 如果 待匹配的 文件名 以'.'開頭, 那麼 這個 '.' 字符 必須 直接 給出. (比如說, \'rm *' 不會 刪除 '.profile' 文件, 'tar c *' 不會 打包 你的 所有 文件; 用 'tar c .' 會 更好.) .SH "空列表 (EMPTY LISTS)" 上述的 簡單優雅 規則, 把 通配符模板 展開爲 匹配的 路徑名, 來源於 最初的 UNIX 定義. 它 允許 展開出 空串, 例如 .br .nf xv -wait 0 *.gif *.jpg .fi 這裏 可能 沒有 *.gif 文件 (而且 不算 錯誤). 然而, POSIX 要求 句法 錯誤 或 路徑名 列表 爲 空 時, 保留 通配符模板 不變. (譯註: 即 不展開.) 在 .I bash 中 可以 通過 設置 .IR allow_null_glob_expansion=true 把 它 強置爲 傳統的 風格. (其他 地方 也有 類似的 問題, 例如, 老式的 語句 是 .br .nf rm `find . -name "*~"` .fi 新的 寫法 爲 .br .nf rm -f nosuchfile `find . -name "*~"` .fi 以 避免 由於 空參數調用 .I rm 而 產生 錯誤信息.) .SH "注意 (NOTES)" .SS "正規表達式 (Regular expressions)" 注意, 通配符模板 不是 正規表達式, 儘管 它們 有點象. 首先, 它 匹配 文件名, 而 不是 正文; 其次, 規則 不一樣, 例如 正規表達式 裏 的 '*' 代表 零個或多個 前面內容的 重複. 正規表達式 的 方括弧表達式 用 '^' 引導 取反操作, (而不是 '[!...]'). POSIX 聲明, 在 通配符模板 中, '[^...]' 未做 定義. .SS "字符集 和 國際化 (Character classes and Internationalization )" 當然, 範圍集 最初 指 ASCII的 範圍, 因此 '[ -%]' 意思是 '[ !"#$%]','[a-z]' 指所有小寫字符. 一些 UNIX實現 把 這個 歸納爲: 範圍 X-Y 指 X的編碼 到 Y的編碼 之間的 編碼字符. 可是, 這 要求 用戶 知道 他們 本地系統的 字符編碼, 此外, 如果 本地的 字母表順序 和 字符集順序 不對應, 那 就 更不方便了. 因此, POSIX 對 通配符模板 和 正規表達式 的 方括弧表達法 作了 重大擴展, 上面 我們 知道了 方括弧表達式 中 的 三個 類型, 它們是 (i) 取補集 (ii) 直接列出的 單個字符 和 (iii) 範圍集. POSIX 對 範圍集 在 國際化 方面 作了 更有力的 說明, 並且 增加了 三個 類型: (iii) 範圍 X-Y 由 X 和 Y 之間 所有的字符 組成 (包括X和Y), X 和 Y 的 當前編碼序列 由 當前場合的 LC_COLLATE 分類定義. (iv) 命名字符集, 象 .br .nf [:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:] .fi 因此 可以 用 '[[:lower:]]' 代替 '[a-z]', 它 在 丹麥語 裏 同樣 有效, 雖然 丹麥的 字母表 裏 'z' 後面 還有 三個 字母. 這些 字符集 由 當前場合的 LC_CTYPE 分類定義. (v) 符號對映, 象 '[.ch.]' 或 '[.a-acute.]', 在 '[.' 和 '.]' 之間的 字符串 是 定義 在 當前場合的 對映元素. 注意 這 可以 是 多字符元素. (vi) 等類表達式, 象 '[=a=]', 在 '[=' 和 '=]' 之間的 字符串 是 任意 等類 中 的 對映元素, 它 定義在 當前場合. 例如, '[[=a=]]' 可以 等同於 `[a徉溻]' (警告: 這裏 有 Latin-1 字符), 也就是 `[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.]]'. .SH "SEE ALSO" .BR sh (1), .BR glob (3), .BR fnmatch (3), .BR locale (7), .BR regex (7) .SH "[中文版維護人]" .B 徐明 .SH "[中文版最新更新]" .BR 2000/10/15 第一版 .br .BR 2001/11/17 第一次修訂 .SH "《中國Linux論壇man手冊頁翻譯計劃》" .BI http://cmpp.linuxforum.net .SH "跋" .br 本頁面中文版由中文 man 手冊頁計劃提供。 .br 中文 man 手冊頁計劃:\fBhttps://github.com/man-pages-zh/manpages-zh\fR