O problema não é bash , o problema é sort .
Agora, sort é localidade ciente.
Se você executar o comando locale , ele poderá dizer algo como en_US ou similar (se você estiver nos EUA; outros idiomas terão outros locais). Também pode haver uma codificação ( en_US.UTF8 ).
Agora as localidades também afetam o pedido.
Vamos dar um exemplo simples:
$ x="a\nA\nc\nC\nb\nB\n"
$ echo -ne "$x" | LANG=C sort
A
B
C
a
b
c
Isso parece exatamente o que queremos. Mas ...
$ echo -ne "$x" | LANG=en_US sort
a
A
b
B
c
C
Uh oh!
sort não é o único programa que pode alterar o comportamento com base na localidade.
Se você quiser um comportamento consistente tradicional em todas as configurações, precisará definir LANG .
Isso não é incomum e seu sistema operacional já pode fazer isso como parte de seu próprio script.
Por exemplo ...
No RedHat / CentOS, muitos scripts /etc/rc.d/init.d fazem isso; Por exemplo, /etc/rc.d/init.d/network tem
interfaces=$(ls ifcfg* | \
LANG=C sed -e "$__sed_discard_ignored_files" \
-e '/\(ifcfg-lo$\|:\|ifcfg-.*-range\)/d' \
-e '/ifcfg-[A-Za-z0-9#\._-]\+$/ { s/^ifcfg-//g;s/[0-9]/ & /}' | \
LANG=C sort -k 1,1 -k 2n | \
LANG=C sed 's/ //')
No debian, /etc/init.d/exim4 define LANG=C no início, bem como vários programas em /usr/bin .