
當我嘗試對 ls 命令進行逆向工程時,我發現了一個有趣的行為。當我建立 3 個檔案 、foo.png
、foopa.png
和時fooqa.png
, ls 將它們排序為foopa.png
、foo.png
、 和fooqa.png
。我還嘗試使用 .gif 擴展名,似乎是當 p 和 q 被擴展名的第一個字母和字母表中的下一個字母替換時會發生這種情況;所以在 的情況下。G如果是 g 和 h 的話。 (fooga.gif
、然後foo.gif
、然後fooha.gif
)
為什麼它要以這種方式排序輸出?
答案1
這取決於您所在區域的排序規則:
>LANG=en_IE.UTF-8 ls -1 foo*
foopa.png
foo.png
fooqa.png
>LANG=C ls -1 foo*
foo.png
foopa.png
fooqa.png
您也可以使用 LC_COLLATE 變數而不是 LANG,並使用 POSIX 語言環境而不是 C 語言環境。
C 排序規則純粹是按字母順序(ASCII 順序)。其他排序規則(例如英文)可能會將空格和特殊字元(例如點)視為分隔符,並單獨處理“單字”或只是忽略這些分隔符(此處似乎是這種情況)。
請注意,非 UTF-8 語言環境也使用字母 ASCII 進行排序:
>LANG=en_IE ls -1 foo*
foo.png
foopa.png
fooqa.png
經過更多挖掘後,似乎忽略標點符號是 Unicode 感知區域設定(例如這些*.UTF-8
區域設定)的常見特徵。