记sort中的一个bug

这个bug源自我的同学perypery,在和中文大战三百回合之后。。。

bug具体是这样的

建立一个包含多的全角正反小括号的文件,一个一行:

1
2
3
4
5
$ cat test.txt

然后sort -u test.txt,期望的输出肯定是

1
2
3
$ sort -u test.txt

但是实际上

1
2
$ sort -u a.txt

嗯?怎么回事?哪里去了?

多版本验证以及降级时遇到的问题

sort来自于coreutils这个软件包,在8.13这个版本时还是好好的。。8.{20,21,22}均有这个问题。
于是我先下了一个8.13,打算降级回去,编译的时候发现gets()这个函数已经从stdio.h里面干掉了,编译器表示推荐使用fgets()

猜想,是不是因为这个导致获取文本时出现了变化?这个变化使被识别成了同一个字符?

高版本的解决方案

经我的同学们调查,这个问题在这里也有提及。不仅仅sortuniq也有这个问题。原因果然是被认成了同一个字符。。

不过我的shell内都设置了LANG=zh_CN.UTF-8。按理说不应该啊。。后来发现这个和shell的LOCALE没什么关系,要看Glibc用的是什么LOCALE。对应的就是LC_COLLATE这个变量。不过我把这个变量设置成zh_CN*都没有效果,设置成C(就是POSIX)以后倒是正常了。

所以目前的解决方案就是临时设置一下LC_COLLATE了。因为

The first rule of LC_COLLATE is: don’t use LC_COLLATE.

1
2
3
$ env LC_COLLATE=C sort -u test.txt