我自称为 POSIX shell 大师,但今天我却失策了。
所以这里没有什么奇怪的:
bash# printf 'v10\nv1.' | sort
v1.
v10
因为.
的代码为0x2e
,而0
的代码为0x30
。但是这句话的意思是什么:
bash# printf 'v101\nv1.1' | sort
v101
v1.1
什么?好的,我是一名巫师:
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_DK.utf8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
所以:
bash# printf 'v101\nv1.1' | LC_ALL=C sort
v1.1
v101
如何通过语言环境/排序规则使得"v101" < "v1.1"
?
我认为en_US.UTF-8
语言环境有排序规则可以忽略.
符号。这个测试表明我的看法是正确的:
bash# printf 'v102\nv1.01' | LC_ALL=en_US.UTF-8 sort
v1.01
v102
bash# printf 'v102\nv1.03' | LC_ALL=en_US.UTF-8 sort
v102
v1.03
我说的对吗?如果我说的对,那么谁不喜欢点呢?UTF-8或英语人士或美国人吗?
这是符合POSIX标准的行为吗?