Usando um seq
comando com números de ponto flutuante, minha saída vem com vírgulas em vez de pontos como separadores decimais, apesar de usar pontos na entrada:
seq 0.1 0.3 1.3
0,1
0,4
0,7
1,0
1,3
Presumi que isso estivesse vinculado ao locale LC_NUMERIC
, que está definido como de_DE.UTF-8
, no entanto, uma alteração para en_US.UTF-8
não corrigi-lo e outro sistema que tenho usando as mesmas configurações de localidade retorna pontos. Mesmo definir explicitamente um formato via, por exemplo -f %1.2
, não retorna pontos, mas vírgulas como separadores decimais.
Onde e como mudo esse comportamento? Como garantir que meu script esteja livre de erros em qualquer sistema? Obviamente, qualquer saída será inutilizável para processamento adicional se não for reprocessada por meio tr
de semelhante.
Usando uma instalação em inglês do Mint no fuso horário alemão e raspian na outra máquina.
Edit: locale
configurações nas máquinas fornecidas:
A "vírgula":
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
O "ponto":
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="C.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
A configuração LANGUAGE
não afeta o resultado.
Para excluir erros nas próprias localidades, eu (re)gerei ambos
de_DE.UTF-8
een_US.UTF-8
viae agora o
seq
comportamento parece ser dependente deLC_NUMERIC
ANDLANG
.Se
LC_NUMERIC
não estiver definido/vazio,LANG
define o comportamento alternandoLC_NUMERIC
entrede_DE.UTF-8
een_US.UTF-8
alterna entre vírgulas e pontos, respectivamente.Perigos específicos
No próprio caso de definir um valor errado/inexistente para
LANG
e um não baseado em pontoslocale
, o comportamento pode ser misturado em alguns casos especiais, por exemploNão aparece para,
seq 0.1 0.2 1.4
mas também paraseq 0.1 0.2 1.9
- comportamento muito estranho e IMHO muito perigoso. Portanto, tenha cuidado com a portabilidadeseq
ou defina localidades para qualquer script.Adivinhando descontroladamente, isso parece estar relacionado a algumas alterações manuais em casos específicos (consulte: https://lists.gnu.org/archive/html/bug-coreutils/2008-09/msg00192.html )
ATUALIZAR:
A sugestão dos mantenedores para evitar erros devido a formatos de saída localizados é definir a localidade no próprio script (
LC_NUMERIC=C
). Alterar esse comportamento não está planejado. (Veja o tópico vinculado com o patch abaixo)O problema com a saída mista de ponto e vírgula devido a configurações de localidade incorretas foi reconhecido como um bug e já corrigido pelos mantenedores:
https://lists.gnu.org/archive/html/coreutils/2019-02/msg00002.html