sort命令的错误行为?

我试图在Ubuntu桌面14.04 (Trusty Tahr)中对文件内容进行排序。 在我的情况下,预期结果应该与原始内容相同,但实际结果不是。 为什么?

# cat test.txt a++-a a++-b a++-c ab ac 
 # cat test.txt | sort a++-a ab a++-b ac a++-c 

您可以使用LC_ALL变量,在调用sort之前将其设置为LC_ALL=C

 $ LC_ALL=C sort test.txt a++-a a++-b a++-c ab ac 

如果你想知道这是什么神奇的LC_ALL=C ,请阅读这个答案。 以下是简短摘要:

C语言环境是一种特殊的语言环境,意味着它是最简单的语言环境。 您还可以说,虽然其他语言环境适用于人类,但C语言环境适用于计算机。 在C语言环境中,字符是单字节,字符集是ASCII,排序顺序基于字节值。

另外,正如@KenMollerup指出的那样,引用man sort

  *** WARNING *** The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte values. 

因此,当使用LC_ALL=C sort时,按字节顺序对比较符号。 否则sort将忽略所有非字母数字字符。

排序使用字母和数字排序,与我们相同,忽略特殊字符,如+ – <> …,数字处理数字,因此1,2,3 ..在11,12,1066 1104之前 – 见!

因此,您的列表被视为:aa,ab,ab,ac,ac