unix 排序为不同的用户提供不同的结果

unix sort is giving different results for different users

我想用以下内容对文件名 reportA 进行排序

pat_int_parallel_all


/projects/test
-v ../../../../../../te
min_custom.v
-v ../../../../../../tes
-y ../../../../../../test_
-y ../../../../../../test_lib/test
../../../../../../tesla
/projects/checklist
../../../../../../test_lib/LIB
../../../../../../telib/av
../../../../../../telib/te
+libext+.v
+incdir+/projectsst_relea/ana

当我尝试 sort -u -r reportA >output 时。 我得到了这个结果

-y ../../../../../../test_lib/test
-y ../../../../../../test_
-v ../../../../../../tes
-v ../../../../../../te 
../../../../../../test_lib/LIB
../../../../../../test 
../../../../../../telib/te
../../../../../../telib/av
/projects/test /projects/checklist 
pat_int_parallel_all min_custom.v
+libext+.v
+incdir+/projectsst_relea/ana

我的语言环境输出是 en_US

LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE="en_US"
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=

但是对于使用相同排序命令的其他用户,它会导致不同的输出。

pat_int_parallel_all
min_custom.v
/projects/test
/projects/checklist
../../../../../../test_lib/LIB
../../../../../../tesla
../../../../../../telib/te
../../../../../../telib/av
-y ../../../../../../test_lib/test
-y ../../../../../../test_
-v ../../../../../../tes
-v ../../../../../../te
+libext+.v
+incdir+/projectsst_relea/ana

我朋友的语言环境输出是C

LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C 

我想知道为什么当我的排序别名 SHELL 版本与其他用户相同时,普通的 uinx 排序命令会给出两个不同的结果。甚至 cshrc 设置都是相同的。 是因为特殊字符吗?

谁能解释一下这里出了什么问题。

sort 不同行为的根本原因是 LC_COLLATE 的值。 man 7 locale 的输出表示:

LC_COLLATE

This category governs the collation rules used for sorting and regular expressions, including character equivalence classes and multicharacter collating elements. This locale category changes the behavior of the functions strcoll(3) and strxfrm(3), which are used to compare strings in the local alphabet. For example, the German sharp s is sorted as "ss".

我对 sort source code 的(非常快的)分析是,它转换要使用 strxfrm() 排序的文本行以获得 比较基础, 所以那个字节 即使它们的字节不同 (原文如此).

关于您仍然得到相同输出的事实,正如@Amadan 所说,这很奇怪。您确定您已正确设置语言环境吗?你可以试试 LC_COLLATE="C" sort -ru your_file