Basicamente, como conseguir isso no Bash? Analisar a saída de locale
- declare "$(locale | grep ^LC_CTYPE | tr --delete '"')"
- parece nojento, pois envolve quatro comandos separados. Lembre-se, só porque locale
imprime valores para a maioria ou todas as variáveis não significa que essas variáveis estão realmente definidas! Por exemplo, locale
imprime LC_CTYPE="en_NZ.UTF-8"
(entre outras linhas) na minha máquina, mas echo "$LC_CTYPE"
não imprime nada.
Supondo que a avaliação da saída de
locale
seja segura (assumimos quelocale
não é uma função shell, alias ou outro utilitário não padrão):Isso define todas as
LC_
variáveis associadas no ambiente subshell e gera o valor daLC_CTYPE
variável. Executareval
dentro do subshell evita poluir o ambiente pai com asLC_
variáveis.Exemplo executado em meu sistema OpenBSD onde eu apenas configurei
LANG=C.UTF-8
:Se você deseja definir (e exportar) a
LC_CTYPE
variável para o valor relatado porlocale
sem definir outras variáveis:De acordo com man,
locale
o valorLC_CTYPE
entre aspas duplas significa que é um "valor implícito":o que significa que
LC_CTYPE
não está definido elocale
imprimirá o valor "implícito" que, se bem entendi , será o valor deLC_ALL
ou, se também não estiver definido, o valor deLANG
:Portanto,
locale
usará o primeiro valor que encontrar, nesta ordem:LC_ALL
, thenLC_CTYPE
e then.LANG
Observe queLC_ALL
tem precedência se definido, portanto, mesmo queLC_CTYPE
também tenha sido definido (talvez para uma localidade diferente)locale
, reportará o valor deLC_ALL
forLC_CTYPE
.Concluindo, para obter o valor
LC_CTYPE
que está sendo usado atualmente,locale
você pode executar algo comoInicialmente eu pensei que o objetivo era obter o valor real de
LC_CTYPE
if set e somente se não estiver definido, voltar ao quelocale
usa, caso em que as duas primeiras variáveis têm que ser trocadas:Se você deseja apenas analisar a saída
locale
e definir a variável, basta obtê-la diretamente assim:Isso seleciona apenas a
LC_TYPE
linha:E então você coloca isso, usando o
.
builtin, no shell atual:Observe que isso requer um shell que suporte substituição de processo , como
bash
orzsh
ouksh
e outros. Se você não estiver usando esse shell, talvez seja necessário fazer algo mais complicado, comoSem usar nenhum comando externo, exceto
locale
: