jeremy@ubuntu:/tmp$ ls /usr/sbin/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*
/usr/sbin/ModemManager /usr/sbin/NetworkManager
這個命令產生了期望的結果即只有以大寫字母開頭的文件名,但是:
jeremy@ubuntu:/tmp$ ls /usr/sbin/[A-Z]*
/usr/sbin/bccmd /usr/sbin/pm-hibernate
/usr/sbin/biosdecode /usr/sbin/pm-powersave
/usr/sbin/bluetoothd /usr/sbin/pm-suspend
/usr/sbin/chat /usr/sbin/pm-suspend-hybrid
/usr/sbin/chgpasswd /usr/sbin/popcon-largest-unused
/usr/sbin/chpasswd /usr/sbin/popularity-contest
/usr/sbin/chroot /usr/sbin/pppconfig
/usr/sbin/cpgr /usr/sbin/pppd
/usr/sbin/cppw /usr/sbin/pppdump
/usr/sbin/cracklib-check /usr/sbin/pppoeconf
/usr/sbin/cracklib-format /usr/sbin/pppoe-discovery
/usr/sbin/cracklib-packer /usr/sbin/pppstats
通過這個命令我們得到整個不同的結果,(輸出了壹大堆,只顯示了壹部分結果列表)。為什麽會是那樣?
這就要追溯到 Unix 剛剛開發的時候,它只知道 ASCII 字符,並且這個特性反映了事實。在 ASCII中,前 32 個字符(數字 0 - 31)都是控制碼(如 tabs,backspaces,和回車)。隨後的 32 個字符(32 - 63)包含可打印的字符,包括大多數的標點符號和數字 0 到 9。再隨後的 32 個字符(64 - 95)包含大寫字符和壹些更多的標點符號。最後的31 個字符(96 - 127)包含小寫字母和更多的標點符號。基於這種安排方式,系統使用這種排序規則的ASCII:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
這個不同於正常的字典順序,其像這樣:
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
隨著 Unix 系統的知名度在美國之外的國家傳播開來,就需要支持不在 U.S. 英語範圍內的字符。於是就擴展了這個 ASCII 字符表,使用了整個 8 位,添加了字符(數字 128 - 255),這樣就容納了更多的語言。為了支持這種能力,POSIX 標準介紹了壹種叫做 locale 的概念,其可以被調整,來為某個特殊的區域,選擇所需的字符集,即系統的語言設置。通過這個設置,POSIX 相容的應用程序將會使用字典排列順序而不是 ASCII 順序。這就解釋了上述命令的行為。當 [A-Z] 字符區域按照字典順序解釋的時候,包含除了小寫字母“a”之外的所有字母,因此得到這樣的結果。