「LC_COLLATE=en_US.UTF-8 ls -l」の順序をデバッグまたは追跡するにはどうすればよいですか?

「LC_COLLATE=en_US.UTF-8 ls -l」の順序をデバッグまたは追跡するにはどうすればよいですか?

en_US.UTF-8 ロケールで予期しないソート順序が発生しました。UTFソートの基本説明)

次のテストシナリオを考えてみましょう。

# touch abc{.{g,t,t.t},@.s,-{s-w,t.c}}
# LC_COLLATE="en_US.UTF-8" ls -l test
total 0
-rw-r--r-- 1 root root 0 May  8 08:52 abc.g
-rw-r--r-- 1 root root 0 May  8 08:52 [email protected]
-rw-r--r-- 1 root root 0 May  8 08:52 abc-s-w
-rw-r--r-- 1 root root 0 May  8 08:52 abc.t
-rw-r--r-- 1 root root 0 May  8 08:52 abc-t.c
-rw-r--r-- 1 root root 0 May  8 08:52 abc.t.t

私は「すべてのドット」または「すべてのマイナス記号」が最初にソートされると思いましたが、結果は興味深いブレンドのようです。使用されたパッケージは

coreutils-8.25-13.7.1.x86_64
glibc-2.22-100.8.1.x86_64
glibc-locale-2.22-100.8.1.x86_64

LC_COLLATE=POSIX「正しい」ソートを使用した結果:

# ls -l test
total 0
-rw-r--r-- 1 root root 0 May  8 08:52 abc-s-w
-rw-r--r-- 1 root root 0 May  8 08:52 abc-t.c
-rw-r--r-- 1 root root 0 May  8 08:52 abc.g
-rw-r--r-- 1 root root 0 May  8 08:52 abc.t
-rw-r--r-- 1 root root 0 May  8 08:52 abc.t.t
-rw-r--r-- 1 root root 0 May  8 08:52 [email protected]

いくつかの詳細:

# locale -k LC_COLLATE
collate-nrules=0
collate-rulesets=""
collate-symb-hash-sizemb=0
collate-codeset="ANSI_X3.4-1968"
# LC_COLLATE="en_US.UTF-8" locale -k LC_COLLATE
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2707
collate-codeset="UTF-8"

詳細なトレースやデバッグメッセージのようにソートを「説明」する方法はありますか?コマンドである必要はありませんが、lsいくつかの簡単なデモコードも機能します。

LC_COLLATE少し「より伝統的な」UTF-8の安全な代替手段はありますか?つまり、LC_COLLATE=POSIX安全に使えますか?

ベストアンサー1

おすすめ記事