107.3 Localização e internacionalização (Peso 3)
Ter a capacidade de localizar o sistema em uma lingua diferente do Inglês. Como também, conhecer o porque LANG=C é útil quando estamos escrevendo scripts.
Configurar locais e variáveis de ambiente
Configurar timezones
e variáveis de ambiente
O Linux internamente trabalha com UTC. Por exemplo quando ele salva um arquivo ele grava as informações de data em UTC, mas apenas para visualização do usuário final ele exibe de outra forma.
/etc/timezone
Algumas distribuições utilizam esse arquivo para configurar o seu timezone. Então para mudar o seu timezone basta mudar o conteúdo desse arquivo de texto.
cat /etc/timezone
America/Belem
/etc/localtime
Esse é o principal arquivo de configuração de timezone. Na verdade ele é um link simbólico que aponta para algum arquivo binário dentro do diretório /usr/share/zoneinfo
.
Podemos mudar o timezone removendo o arquivo:
rm /etc/localtime
E criamos novamente o arquivo apontando para um novo timezone:
ln -s /usr/share/zoneinfo/America/Belem /etc/localtime
Veja abaixo como o arquivo é apenas um link que aponta para /usr/share/zoneinfo/America/Belem
ls -l /etc/localtime
lrwxrwxrwx 1 root root 33 Jun 29 23:20 /etc/localtime -> /usr/share/zoneinfo/America/Belem
/usr/share/zoneinfo/
O diretório /usr/share/zoneinfo
é uma estrutura de diretório com configurações de diferentes timezones. Sendo que muitas delas são apenas links para outras configurações.
LC_TIME
Variável de localização é utilizada para definir a formatação de data e hora?
LC_*
LC_ALL
LANG
TZ
O TZ
é uma variável de ambiente que armazena o timezone da sessão atual. Por padrão ela não vem setada:
echo $TZ
Vamos dar um date e verificar a data atual:
date
Sun Aug 12 21:01:20 -03 2018
Perceba que nos estamos utilizando o timezone que esta configurado no arquivo /etc/timezone. Mas podemos mudar isso mudando a variável TZ
.
export TZ=America/Port_of_Spain
Vamos novamente exibir a data atual com o comando date
:
date
Sun Aug 12 20:03:26 AST 2018
Evidentemente se realizarmos um unset na variável TZ nossa data volta a configurada no /etc/timezone
É possivel ainda definir o valor de TZ apontado para o diretorio dentro de /usr/share/zoneinfo. Abaixo configuração realizada utilizando a localização do arquivo:
export TZ=/usr/share/zoneinfo/Mexico/BajaSur
/usr/bin/locale
Esse comando exibe as informações que localização do sistema.
locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=pt_BR.UTF-8
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=pt_BR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_TELEPHONE=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_ALL=
A variável LC_ALL sobreescrve todas as demais.
Essas informações são na verdade variáveis de ambiente. Podemos ver essas mesmas informações com o comando abaixo:
env | grep "^LC"
LC_TELEPHONE=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_NUMERIC=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_PAPER=pt_BR.UTF-8
LC_MONETARY=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_CTYPE=en_US.UTF-8
LANG=C
Quando escrevemos um script e não queremos que as configurações de localização afetem o comportamento do nosso script. Para resolver isso basta deixar a variável LANG com o valor C
.
tzselect
É um comando que nos ajuda a encontrar o timezone que desejamos definir no sistema. Ele não altera a configuração do sistema apenas exibe o timezone escolhido. Veja abaixo a utilização do comando:
tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
1) Africa
2) Americas
3) Antarctica
4) Asia
5) Atlantic Ocean
6) Australia
7) Europe
8) Indian Ocean
9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#? 2
Please select a country whose clocks agree with yours.
1) Anguilla 19) Dominican Republic 37) Peru
2) Antigua & Barbuda 20) Ecuador 38) Puerto Rico
3) Argentina 21) El Salvador 39) St Barthelemy
4) Aruba 22) French Guiana 40) St Kitts & Nevis
5) Bahamas 23) Greenland 41) St Lucia
6) Barbados 24) Grenada 42) St Maarten (Dutch)
7) Belize 25) Guadeloupe 43) St Martin (French)
8) Bolivia 26) Guatemala 44) St Pierre & Miquelon
9) Brazil 27) Guyana 45) St Vincent
10) Canada 28) Haiti 46) Suriname
11) Caribbean NL 29) Honduras 47) Trinidad & Tobago
12) Cayman Islands 30) Jamaica 48) Turks & Caicos Is
13) Chile 31) Martinique 49) United States
14) Colombia 32) Mexico 50) Uruguay
15) Costa Rica 33) Montserrat 51) Venezuela
16) Cuba 34) Nicaragua 52) Virgin Islands (UK)
17) Curaçao 35) Panama 53) Virgin Islands (US)
18) Dominica 36) Paraguay
#? 1
The following information has been given:
Anguilla
Therefore TZ='America/Port_of_Spain' will be used.
Local time is now: Sun Aug 12 19:57:41 AST 2018.
Universal Time is now: Sun Aug 12 23:57:41 UTC 2018.
Is the above information OK?
1) Yes
2) No
#? yes
Please enter a number in range.
#? 1
You can make this change permanent for yourself by appending the line
TZ='America/Port_of_Spain'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
America/Port_of_Spain
timedatectl
Esse comando é utilizado para exibir da data atual em diferente formatos:
timedatectl
Local time: Sun 2018-08-12 20:36:33 -03
Universal time: Sun 2018-08-12 23:36:33 UTC
RTC time: Sun 2018-08-12 23:36:33
Time zone: America/Belem (-03, -0300)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no