- Dave McKay
@TheGurkha
>li>28 de Abril de 2020, 8:00am EDT
Há mais do que um tipo de variável de ambiente no Linux. Aprenda como vê-las, criá-las para logins locais e remotos, e fazê-las sobreviver a reinicializações.
Como funcionam as variáveis de ambiente
Quando se lança uma janela terminal e a shell dentro dela, uma colecção de variáveis é referenciada para assegurar que a shell está correctamente configurada. Estas variáveis asseguram também que qualquer informação à qual a janela terminal e a shell possam precisar de se referir está disponível. Colectivamente, estas variáveis contêm definições que definem o ambiente que se encontra dentro da janela de terminal, até ao aspecto do prompt de comando. Assim, naturalmente, são referidas como variáveis de ambiente.
Algumas variáveis de ambiente são de todo o sistema, ou globais. Outras são a nível de sessão e só podem ser vistas por si. Outras não podem referenciar as variáveis de ambiente da sua sessão. Há um terceiro conjunto de variáveis de ambiente definidas dentro da shell. O seu locale, fuso horário e definições de teclado, o conjunto de directórios pesquisados quando a shell tenta encontrar um comando, e o seu editor predefinido, são todos armazenados nas variáveis de ambiente da shell.
Vamos mostrar-lhe como ver as variáveis de ambiente que existem no seu sistema, e vamos descrever como criar a sua própria. Também lhe mostraremos como disponibilizá-las aos processos infantis e ser persistente através de reinicializações.
Ambientes e Herança
Quando uma concha começa, passa por uma fase de inicialização. É neste ponto que lê as variáveis de ambiente que definem o ambiente da shell.
Quando um programa ou comando é lançado a partir dessa shell – conhecido como um processo infantil – herda o ambiente do processo parental – mas cuidado! Como veremos, pode criar variáveis que não são adicionadas ao seu ambiente, para que não sejam herdadas por um processo filho.
Se o processo filho for uma shell, essa shell inicializará a partir do seu próprio, fresco, conjunto de variáveis. Assim, se alterar o prompt de comando na shell actual, e depois lançar uma shell criança, a shell criança não herdará o prompt de comando modificado dos pais.
Variáveis de ambiente global
Por convenção, as variáveis de ambiente recebem nomes em maiúsculas. Aqui estão algumas das variáveis de ambiente globais, e o que representam os valores que contêm:
- SHELL: O nome da concha que será lançada quando se abre uma janela terminal. Na maioria das distribuições Linux, isto será bash, a menos que o altere do padrão.
- TERM: As janelas de terminal são na realidade emulações de um terminal de hardware. Isto contém o tipo de terminal de hardware que será emulado.
- USUÁRIO: O nome de utilizador da pessoa que utiliza o sistema actual.
- PWD: O caminho para o directório de trabalho actual.
- OLDPWD: O directório em que se encontrava antes de passar para o directório de trabalho actual.
- LS_COLORS: A lista de códigos de cor utilizados pelo
ls
destaca diferentes tipos de ficheiros. - MAIL: Se o sistema
mail
foi configurado no seu computador Linux (por defeito, não está), isto irá manter o caminho para a caixa de correio do utilizador actual. - PATH: Uma lista de directórios que a shell irá procurar para encontrar executáveis de comando.
- LANG: A linguagem, localização, e definições de codificação de caracteres.
- HOME: O directório home do utilizador actual.
- _: A variável de ambiente underscore (
_
) contém o último comando que foi digitado.
RELATADO: Como usar pushd e popd no Linux
Podemos ver o que alguns destes estão definidos para usar nada mais sofisticado do que echo
, que irá escrever os valores na janela do terminal. Para ver o valor mantido por uma variável de ambiente, é necessário adicionar um sinal de dólar ($
) ao início do seu nome.
Um toque agradável é que pode usar o preenchimento de tabulação para preencher o nome da variável de ambiente para si. Escreva algumas letras do nome e carregue em Tab. O nome da variável é completado pela concha. Se isso não acontecer, terá de digitar mais algumas letras para distinguir a variável de ambiente de outros comandos com nomes que comecem com essas mesmas letras:
echo $SHELL
echo $LANG
echo $HOME
echo $PWD
Para criar as suas próprias variáveis de ambiente global, adicioná-los ao ficheiro /etc/environment
. Terá de usar sudo
para editar este ficheiro:
sudo gedit /etc/environment
para adicionar uma variável de ambiente, digite o seu nome, um sinal de igual (=
), e o valor que deseja que a variável ambiente tenha. Não espaçar antes ou depois do sinal de igual (=
). O nome da variável de ambiente pode conter letras, um sublinhado (_
), ou números. Contudo, o primeiro caractere de um nome não pode ser um número.
Se houver espaços no valor, certifique-se de que inclui todo o valor entre aspas ("
).
Guardar o ficheiro, e depois sair e voltar a entrar novamente. Use echo
para testar que uma nova variável existe e detém o valor que definiu:
echo $WEBSITE
Porque é uma variável ambiental global, e disponível para todos, o utilizador mary
pode referenciar a variável ambiental quando se regista a seguir em:
echo $WEBSITE
Para ver todas as variáveis de ambiente de uma só vez, digite printenv
. Há muita saída, por isso faz sentido canalizá-la através de sort
, e depois em less
:
printenv | sort | less
A lista ordenada de variáveis de ambiente é exibida para nós em less
.
Podemos canalizar a saída através de grep
para procurar variáveis de ambiente relacionadas com um tópico em particular.
printenv | grep GNOME
RELATADO: Como editar graficamente ficheiros de texto no Linux Com gedit
Shell Environment Variables
Estas são algumas das variáveis de ambiente de shell utilizadas em bash
para ditar ou registar o seu comportamento e funcionalidade. Alguns dos valores são actualizados à medida que se utiliza o terminal. Por exemplo, a variável de ambiente COLUMNS
será actualizada para reflectir as alterações que possa fazer à largura da janela do terminal:
- BASHOPTS: As opções de linha de comando que foram utilizadas quando
bash
foi lançado. - BASH_VERSION: O
bash
número da versão como uma cadeia de palavras e números. - BASH_VERSINFO: O
bash
versão como um dígito. - COLUMNS: A largura actual da janela de terminal.
- DIRSTACK: Os directórios que foram adicionados à pilha de directórios pelo comando
pushd
. - HISTFILESIZE: Número máximo de linhas permitido no comando
history
file. - HISTSIZE: Número de linhas de
history
permitido em memória. - HOSTNAME: O hostname do computador.
- IFS: O Separador de Campo Interno utilizado para separar a entrada na linha de comando. Por defeito, este é um espaço.
- PS1: A variável de ambiente
PS1
detém a definição para o prompt de comando primário, por defeito, e de comando. Um conjunto de fichas chamado sequências de escape pode ser incluído na definição do seu prompt de comando. Representam coisas como o host- e o nome de utilizador, o directório de trabalho actual, e a hora. - PS2: Quando um comando abrange mais do que uma linha e se espera mais entrada, é mostrado o prompt de comando secundário. A variável de ambiente
PS2
detém a definição desta prompt secundária, que, por defeito, é o maior sinal (>
). - SHELLOPTS: Opções Shell que pode definir utilizando o
set
option. - UID: O Identificador do Utilizador actual.
RELATADO: Como Usar pushd e popd em Linux
Vamos verificar algumas destas variáveis shell:
echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID
Por uma questão de completude, aqui estão as fichas que pode utilizar no comando de definições:
- \t: A hora actual, formatada como HH:MM:SS.
- \d: A data actual, expressa como dia da semana, mês, data.
- \n: Um novo carácter de linha.
- \s: O nome da sua concha.
- \a: O nome do seu directório de trabalho actual.
- \a: O caminho para o seu directório de trabalho actual.
- \u: O nome de utilizador da pessoa que iniciou sessão.
- \h: O hostname do computador.
- \#: Cada comando dentro de uma shell é numerado. Isto permite-lhe ver o número do comando no seu prompt de comando. Isto não é o mesmo que o número que o comando terá no
history
list. - \$: Define o carácter final do prompt para um sinal de dólar (
$
) para um utilizador regular, e um símbolo hash (#
) para o utilizador raiz. Isto funciona através da verificação do UID do utilizador. Se for zero, o utilizador é root.
Encontrará a definição do seu PS1
variável de ambiente no seu .bashrc
ficheiro.
Criar variáveis de ambiente de sessão
Para criar variáveis de ambiente para seu próprio uso, adicione-as ao fundo do seu .bashrc
ficheiro. Se quiser ter as variáveis de ambiente disponíveis para sessões remotas, tais como ligações SSH, terá de as adicionar ao seu .bash_profile
ficheiro, bem como.
O formato da definição da variável de ambiente é o mesmo para ambos os ficheiros. Para adicionar uma definição ao seu ficheiro .bash_profile
, digite-a no seu directório home:
gedit .bashrc
Adicionámos uma variável de ambiente chamada INHERITED_VAR
. Note a palavra “exportar” no início da linha.
Guardar e fechar o seu ficheiro depois de terminar a edição. Pode sair e voltar a entrar novamente, ou pode fazer com que a shell releia o ficheiro .bash_profile
usando o comando dot (.
) assim:
. .bashrc
Agora, vamos criar uma variável de ambiente na linha de comando:
LOCAL_VAR="This session only"
Se usarmos echo
, podemos ver que ambas as variáveis de ambiente estão acessíveis a nós:
echo $LOCAL_VAR
echo $INHERITED_VAR
Você notará a definição da variável de ambiente INHERITED_VAR
tinha a palavra “exportar” no início da linha. Isto significa que a variável de ambiente será herdada por processos infantis da actual casca. Se lançarmos outra usando o comando bash
, podemos verificar novamente as duas variáveis, a partir do interior da concha criança:
bash
echo $LOCAL_VAR
echo $INHERITED_VAR
Como pode ver, o INHERITED_VAR
é acessível na concha da criança, mas LOCAL_VAR
não é. Simplesmente obtemos uma linha em branco.
Embora “exportar” acrescente a parte variável de ambiente ao ambiente que a criança processa herda, INHERITED_VAR
não é uma variável de ambiente global. Por exemplo, o utilizador mary
não a pode referenciar:
echo $INHERITED_VAR
Para fechar o nosso filho bash
sessão, usamos exit
:
exit
Ambientes herdados também afectam os scripts. Aqui está um script simples que escreve os valores das nossas três variáveis de ambiente na janela terminal:
#!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR
Isto foi guardado num ficheiro chamado envtest.sh
, e depois tornado executável com o seguinte:
chmod +x envtest.sh
Quando executamos o script, este pode aceder a duas de três variáveis de ambiente:
./envtest.sh
O script pode ver a variável de ambiente WEBSITE
global environment variable e a variável de ambiente INHERITED_VAR
export environment variable. Não pode aceder a LOCAL_VAR
, mesmo que o script esteja a correr na mesma shell onde a variável foi criada.
Se for necessário, podemos exportar uma variável de ambiente a partir da linha de comando. Faremos isso ao nosso LOCAL_VAR
, e depois executaremos novamente o script:
export LOCAL_VAR
./envtest.sh
A variável ambiente foi adicionada ao ambiente da actual shell, e assim aparece no ambiente que é herdado pelo script. O script também pode fazer referência a essa variável de ambiente.
Conexões Remotas
As variáveis de ambiente globais são acessíveis a sessões de login remoto, mas se quiser que as suas variáveis de ambiente definidas localmente estejam disponíveis remotamente, deve adicioná-las ao seu ficheiro .bash_profile
. Pode definir a mesma variável de ambiente nos ficheiros .bashrc
e .bash_profile
, com valores diferentes. Isto poderia ser captado por um script, digamos, para modificar o seu comportamento para pessoas que utilizam o sistema local ou remotamente.
(Com o risco de confusão, há também um ficheiro .profile
. Também pode conter definições de variáveis de ambiente. Contudo, o ficheiro .profile
não é lido se o ficheiro .bash_profile
estiver presente. Portanto, o mais seguro a fazer – e o bash
forma compatível – é utilizar o ficheiro .bash_profile
.)
Para editar o ficheiro .bash_profile
, utilizaremos gedit
novamente:
gedit .bash_profile
Vamos adicionar a mesma variável de ambiente com o mesmo valor que usávamos antes.
>O ficheiro .bash_profile aberto num editor com uma nova variável de ambiente a ser adicionada.
Guardar as suas alterações e fechar gedit
.
Em outro computador, faremos uma ligação SSH
ao computador de teste.
ssh [email protected]
Após estarmos ligados, executaremos o script mais uma vez:
./envtest.sh
O ficheiro .bash_profile
foi lido como parte da inicialização do login remoto, e a variável de ambiente INHERITED_VAR
está acessível para nós e para o script.
Desactivar uma variável de ambiente
Para desactivar uma variável de ambiente, usar o comando unset
. Se desactivarmos a variável de ambiente global, WEBSITE
, e a variável de ambiente exportada, INHERITED_VAR
, deixarão de estar disponíveis na linha de comando, nem nos processos infantis:
unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE
Um ponto a notar é que isto apenas altera a disponibilidade de variáveis de ambiente globais para si nesta sessão. Outra pessoa que tenha entrado simultaneamente no sistema poderá ainda aceder à sua instância dessa variável de ambiente global. A sua instância foi iniciada e lida a partir do ficheiro /etc/environment
durante o seu processo de login, e é independente da cópia da variável de qualquer outra pessoa.
Como exemplo, o utilizador mary
ainda pode aceder à variável de ambiente WEBSITE
e ler o seu valor, embora o utilizador dave
tenha unset
na sua sessão:
echo $WEBSITE
Controlo ambiental
Varáveis ambientais podem ser utilizadas para que os scripts e aplicações saibam como se devem comportar. Podem ser usadas para armazenar configurações ou pequenas quantidades de dados. Por exemplo, um script pode povoar um ambiente com um valor que pode ser referenciado por outros scripts sem ter de os escrever num ficheiro.
Dave McKay usou pela primeira vez computadores quando a fita de papel perfurado estava na moda, e tem vindo a programar desde então. Após mais de 30 anos na indústria das TI, é agora um jornalista de tecnologia a tempo inteiro. Durante a sua carreira, trabalhou como programador freelance, gestor de uma equipa internacional de desenvolvimento de software, gestor de projectos de serviços de TI e, mais recentemente, como responsável pela protecção de dados. Dave é um evangelista Linux e defensor do código aberto. Leia a biografia completa ”