Como definir variáveis ​​de ambiente no Bash no Linux

Existe mais de um tipo de variável de ambiente no Linux. Aprenda como vê-los, criá-los para logins locais e remotos e fazer com que sobrevivam a reinicializações.

Como funcionam as variáveis ​​de ambiente

Quando você abre uma janela de terminal e a casca dentro dela, uma coleção de variáveis ​​é referenciada para garantir que o shell esteja configurado corretamente. Essas variáveis ​​também garantem que todas as informações às quais a janela do terminal e o shell possam se referir estejam disponíveis. Coletivamente, essas variáveis ​​contêm configurações que definem o ambiente que você encontra dentro da janela do terminal, até a aparência do prompt de comando. Então, naturalmente, eles são chamados de variáveis ​​de ambiente.

Algumas variáveis ​​de ambiente são de todo o sistema ou globais. Outros são para toda a sessão e só podem ser vistos por você. Outros não podem fazer referência às variáveis ​​de ambiente de sua sessão. Há um terceiro conjunto de variáveis ​​de ambiente definidas no shell. Sua localidade, fuso horário e configurações de teclado, o conjunto de diretórios pesquisados ​​quando o shell tenta encontrar um comando e seu editor padrão são armazenados em variáveis ​​de ambiente do shell.

Mostraremos como ver as variáveis ​​de ambiente que existem em seu sistema e descreveremos como criar as suas próprias. Também mostraremos como disponibilizá-los para processos filho e ser persistentes durante as reinicializações.

Ambientes e herança

Quando um shell é iniciado, ele passa por uma fase de inicialização. É neste ponto que ele lê as variáveis ​​de ambiente que definem o ambiente do shell.

Quando um programa ou comando é iniciado a partir desse shell – conhecido como processo filho – ele herda o ambiente do processo pai – mas cuidado! Como veremos, você pode criar variáveis ​​que não são adicionadas ao seu ambiente, portanto, não serão herdadas por um processo filho.

Se o processo filho for um shell, esse shell inicializará a partir de seu próprio conjunto de variáveis ​​novo. Portanto, se você alterar o prompt de comando no shell atual e, em seguida, lançar um shell filho, o shell filho não herdará o prompt de comando modificado do pai.

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 quais são os valores que elas contêm:

SHELL: O nome do shell que será iniciado quando você abrir uma janela de terminal. Na maioria das distribuições Linux, isso vai ser bash a menos que você altere o padrão.
PRAZO: As janelas de terminal são, na verdade, emulações de um terminal de hardware. Isso contém o tipo de terminal de hardware que será emulado.
USUÁRIO: O nome de usuário da pessoa atual usando o sistema.
PWD: O caminho para o diretório de trabalho atual.
OLDPWD: O diretório em que você estava antes de mover para o diretório de trabalho atual.
LS_COLORS: A lista de códigos de cores usados ​​pelo ls destacar diferentes tipos de arquivo.
CORREIO: Se o sistema de e-mail foi configurado em seu computador Linux (por padrão, não é), isso irá segurar o caminho para a caixa de correio do usuário atual.
PATH: Uma lista de diretórios que o shell pesquisará para encontrar executáveis ​​de comando.
LANG: As configurações de idioma, localização e codificação de caracteres.
HOME: o diretório inicial do usuário atual.
_: A variável de ambiente sublinhado (_) contém o último comando que foi digitado.

Podemos ver o que alguns deles estão configurados para usar nada mais sofisticado do que o eco, que irá escreva os valores na janela do terminal. Para ver o valor mantido por uma variável de ambiente, você precisa adicionar um cifrão ($) ao início de seu nome.

Um toque legal é que você pode usar conclusão da guia para preencher o nome da variável de ambiente para você. Digite algumas letras do nome e pressione Tab. O nome da variável é completado pelo shell. Se isso não acontecer, você precisará digitar mais algumas letras para distinguir a variável de ambiente de outros comandos com nomes que começam com essas mesmas letras:

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

Para criar suas próprias variáveis ​​de ambiente globais, adicione-as ao arquivo / etc / environment. Você precisará usar sudo para editar este arquivo:

sudo gedit /etc/environment

Para adicionar uma variável de ambiente, digite seu nome, um sinal de igual (=) e o valor que você deseja que a variável de ambiente contenha. Não coloque espaço antes ou depois do sinal de igual (=). O nome da variável de ambiente pode conter letras, um sublinhado (_) ou números. No entanto, o primeiro caractere de um nome não pode ser um número.

Se houver espaços no valor, certifique-se de colocar todo o valor entre aspas (“).

Salve o arquivo, faça logout e login novamente. Use echo para testar se uma nova variável existe e mantém o valor que você definiu:

echo $WEBSITE

Por ser uma variável de ambiente global e disponível para todos, a usuária mary pode fazer referência à variável de ambiente na próxima vez que fizer login:

echo $WEBSITE

Para veja todas as variáveis ​​de ambiente imediatamente, digite printenv. Há muita saída, então faz sentido canalizá-la por meio de classificação e depois em menos:

printenv | sort | less

A lista classificada de variáveis ​​de ambiente é exibida para nós em menos.

Podemos canalizar a saída por meio de grep para procurar variáveis ​​de ambiente relacionado a um tópico particular.

printenv | grep GNOME

Variáveis ​​de Ambiente Shell

Essas são algumas das variáveis ​​de ambiente do shell usadas no bash para ditar ou registrar seu comportamento e funcionalidade. Alguns dos valores são atualizados conforme você usa o terminal. Por exemplo, a variável de ambiente COLUMNS será atualizada para refletir as alterações que você pode fazer na largura da janela do terminal:

BASHOPTS: As opções de linha de comando que foram usadas quando o bash foi lançado.
BASH_VERSION: o número da versão do bash como uma sequência de palavras e números.
BASH_VERSINFO: A versão do bash como um dígito.
COLUNAS: A largura atual da janela do terminal.
DIRSTACK: Os diretórios que foram adicionado à pilha de diretórios pelo comando pushd.
HISTFILESIZE: Número máximo de linhas permitidas no arquivo de histórico.
HISTSIZE: Número de linhas de história permitidas na memória.
HOSTNAME: o nome do host do computador.
IFS: o Separador de campo interno usado para separar a entrada na linha de comando. Por padrão, este é um espaço.
PS1: A variável de ambiente PS1 contém a definição do prompt de comando principal, padrão e. Um conjunto de tokens denominado sequências de escape pode ser incluído na definição de seu prompt de comando. Eles representam coisas como o host e o nome de usuário, o diretório de trabalho atual e a hora.
PS2: Quando um comando se estende por mais de uma linha e mais entradas são esperadas, o prompt de comando secundário é mostrado. A variável de ambiente PS2 contém a definição deste prompt secundário, que, por padrão, é maior que o sinal (>).
SHELLOPTS: opções de shell que você pode definir usando a opção set.
UID: o Identificador de usuário do usuário atual.

Vamos verificar algumas dessas variáveis ​​de shell:

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

Para fins de integridade, aqui estão os tokens que você pode usar nas definições do prompt de comando:

t: A hora atual, formatada como HH: MM: SS.
d: A data atual, expressa como dia da semana, mês, data.
n: um caractere de nova linha.
s: o nome do seu shell.
W: O nome do seu diretório de trabalho atual.
w: o caminho para seu diretório de trabalho atual.
u: O nome de usuário da pessoa que está logado.
h: O nome do host do computador.
#: Cada comando dentro de um shell é numerado. Isso permite que você veja o número do comando em seu prompt de comando. Este não é o mesmo que o número que o comando terá na lista de histórico.
$: Define o caractere final do prompt como um cifrão ($) para um usuário comum e um símbolo de hash (#) para o usuário root. Isso funciona verificando o UID do usuário. Se for zero, o usuário é root.

Você encontrará a definição de sua variável de ambiente PS1 em seu arquivo .bashrc.

Criação de variáveis ​​de ambiente de sessão

Para criar variáveis ​​de ambiente para seu próprio uso, inclua-as na parte inferior do arquivo .bashrc. Se você quiser ter as variáveis ​​de ambiente disponíveis para sessões remotas, como conexões SSH, também precisará adicioná-las ao arquivo .bash_profile.

O formato da definição da variável de ambiente é o mesmo para os dois arquivos. Para adicionar uma definição ao seu arquivo .bash_profile, digite isto em seu diretório inicial:

gedit .bashrc

Adicionamos uma variável de ambiente chamada INHERITED_VAR. Observe a palavra “exportar” no início da linha.

Salve e feche seu arquivo após terminar de editar. Você pode fazer logout e login novamente, ou pode fazer com que o shell releia o arquivo .bash_profile usando o comando dot (.) Como este:

. .bashrc

Agora, vamos criar uma variável de ambiente na linha de comando:

LOCAL_VAR="This session only"

LOCAL_VAL =

Se usarmos echo, podemos ver que ambas as variáveis ​​de ambiente são acessíveis para nós:

echo $LOCAL_VAR
echo $INHERITED_VAR

Você notará que a definição da variável de ambiente INHERITED_VAR tem a palavra “exportar” no início da linha. Isso significa que a variável de ambiente será herdada por processos filho do shell atual. Se lançarmos outro usando o comando bash, podemos verificar as duas variáveis ​​novamente, de dentro do shell filho:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

Como você pode ver, o INHERITED_VAR está acessível no shell filho, mas LOCAL_VAR não. Simplesmente obtemos uma linha em branco.

Embora “exportar” adicione a parte da variável de ambiente ao ambiente que os processos filhos herdam, INHERITED_VAR não é uma variável de ambiente global. Por exemplo, o usuário mary não pode fazer referência a ele:

echo $INHERITED_VAR

Para fechar nossa sessão bash filha, usamos exit:

exit

Os ambientes herdados também afetam os scripts. Aqui está um script simples que grava os valores de nossas três variáveis ​​de ambiente na janela do terminal:

#!/bin/bash

echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

Ele foi salvo em um arquivo chamado envtest.sh e, em seguida, tornado executável com o seguinte:

chmod +x envtest.sh

Quando executamos o script, ele pode acessar duas das três variáveis ​​de ambiente:

./envtest.sh

O script pode ver a variável de ambiente global WEBSITE e a variável de ambiente exportada INHERITED_VAR. Não pode acessar LOCAL_VAR, embora o script esteja rodando no mesmo shell onde a variável foi criada.

Se necessário, podemos exportar uma variável de ambiente da linha de comando. Faremos isso em nosso LOCAL_VAR e, em seguida, executaremos o script novamente:

export LOCAL_VAR
./envtest.sh

A variável de ambiente foi adicionada ao ambiente do shell atual e, portanto, aparece no ambiente herdado pelo script. O script também pode fazer referência a essa variável de ambiente.

Conexões Remotas

Variáveis ​​de ambiente globais são acessíveis para sessões de login remotas, mas se você deseja que suas variáveis ​​de ambiente definidas localmente estejam disponíveis para você remotamente, você deve incluí-las em seu arquivo .bash_profile. Você pode definir a mesma variável de ambiente nos arquivos .bashrc e .bash_profile, com valores diferentes. Isso poderia ser captado por um script, digamos, para modificar seu comportamento para pessoas que usam o sistema local ou remotamente.

(Correndo o risco de confundir as coisas, há também um arquivo .profile. Ele também pode conter definições de variáveis ​​de ambiente. No entanto, o arquivo .profile não é lido se o arquivo .bash_profile estiver presente. Portanto, a coisa mais segura a fazer – e a maneira compatível com bash – é usar o arquivo .bash_profile.)

Para editar o arquivo .bash_profile, usaremos o gedit novamente:

gedit .bash_profile

Vamos adicionar a mesma variável de ambiente com o mesmo valor que usamos antes.

Salve suas alterações e feche o gedit.

Em outro computador, faremos um SSH conexão com o computador de teste.

ssh [email protected]

Assim que estivermos conectados, executaremos o script mais uma vez:

./envtest.sh

O arquivo .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.

Desconfigurando uma Variável de Ambiente

Para remover a definição de uma variável de ambiente, use o comando desarmado. Se removermos a definição da variável de ambiente global, WEBSITE, e da variável de ambiente exportada, INHERITED_VAR, elas não estarão mais disponíveis na linha de comando, nem em processos filho:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

Um ponto a ser observado é que isso apenas altera a disponibilidade de variáveis ​​de ambiente globais para você nesta sessão. Outra pessoa que efetuou login simultaneamente ainda poderá acessar sua instância dessa variável de ambiente global. Sua instância foi inicializada e lida do arquivo / etc / environment durante seu processo de login e é independente da cópia de qualquer outra pessoa da variável.

Por exemplo, a usuária mary ainda pode acessar a variável de ambiente WEBSITE e ler seu valor, mesmo que o usuário dave a tenha cancelado em sua sessão:

echo $WEBSITE

Controle ambiental

Variáveis ​​de ambiente podem ser usadas para permitir que scripts e aplicativos saibam como devem se comportar. Eles podem ser usados ​​para armazenar configurações ou pequenas quantidades de dados. Por exemplo, um script pode preencher um ambiente com um valor que pode ser referenciado por outros scripts sem a necessidade de gravá-los em um arquivo.