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
.