Это проблема локали. Обрезка посторонних битов:
$ echo $LANG
en_US.UTF-8
$ (for i in 1 2 3 4 5 6 7 8 9; do base64<<<" $i " ; done)|sort
IDcgCg==
IDEgCg==
IDggCg==
IDIgCg==
IDkgCg==
IDMgCg==
IDQgCg==
IDUgCg==
IDYgCg==
$ (for i in 1 2 3 4 5 6 7 8 9; do base64<<<" $i " ; done)|LC_ALL=C sort
IDEgCg==
IDIgCg==
IDMgCg==
IDQgCg==
IDUgCg==
IDYgCg==
IDcgCg==
IDggCg==
IDkgCg==
(я использую en_US
, но en_CA
почти такой же; просто извиняюсь больше)
Как видите, использование не C
локали делает сортировку без учета регистра, IDcgCg==
предшествует IDEgCg==
, в то время как при использовании C
, наоборот. Вот почему вы видите LC_ALL=C
, часто добавляемый перед чем-либо в скрипте, который должен иметь согласованные результаты независимо от локали пользователя.