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

Um terminal Linux estilizado com linhas de texto verde em um laptop.
fatmawati achmad zaenuri / Shutterstock

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 o shell 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 de 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 existentes 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 é lançado 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 será inicializado 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 letras 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 será bash, a  menos que você altere o padrão.
  • TERM: 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 que usa 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 ​​para ls destacar os diferentes tipos de arquivo .
  • CORREIO: Se o mailsistema foi configurado em seu computador Linux (por padrão, não é), isso manterá o caminho para a caixa de correio do usuário atual .
  • PATH: Uma lista de diretórios que o shell pesquisará para localizar 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 underscore ( ) contém o último comando que foi digitado.
Recomendado:  O que significa “FWIW” e como usá-lo?

Podemos ver o que alguns deles estão configurados para usar nada mais sofisticado do que  echo, que gravará 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 interessante é que você pode usar o preenchimento de tabulação 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

echo $ SHELL em uma janela de terminal

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

sudo gedit / etc / environment

sudo gedit / etc / environment em uma janela de terminal

Para adicionar uma variável de ambiente, digite seu nome, um sinal de igual ( =) e o valor que 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 ( ").

O arquivo / etc / environment aberto em um editor e uma nova variável de ambiente sendo adicionada.

Salve o arquivo e, em seguida, efetue logout e login novamente. Use echopara testar se existe uma nova variável e mantém o valor que você definiu:

echo $ WEBSITE

echo $ WEBSITE em uma janela de terminal.

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

echo $ WEBSITE

echo $ WEBSITE em uma janela de terminal.

Para ver todas as variáveis ​​de ambiente de uma vez, digite  printenv. Há muita saída, então faz sentido canalizá-la sortpara less:

printenv | classificar | Menos

printenv |  classificar |  menos em uma janela de terminal.

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

lista classificada de variáveis ​​de ambiente em menos em uma janela de terminal.

Podemos canalizar a saída greppara procurar variáveis ​​de ambiente relacionadas a um determinado tópico .

printenv | grep GNOME

printenv |  grep GNOME em uma janela de terminal.

Variáveis ​​de Ambiente Shell

Essas são algumas das variáveis ​​de ambiente do shell usadas  bashpara ditar ou registrar seu comportamento e funcionalidade. Alguns dos valores são atualizados conforme você usa o terminal. Por exemplo, a COLUMNSvariável de ambiente 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 bashfoi lançado.
  • BASH_VERSION: o bash número da versão como uma sequência de palavras e números.
  • BASH_VERSINFO: a bashversão como um dígito.
  • COLUNAS: A largura atual da janela do terminal.
  • DIRSTACK: Os diretórios que foram adicionados à pilha de diretórios pelo pushdcomando.
  • HISTFILESIZE: Número máximo de linhas permitidas no  history arquivo.
  • HISTSIZE: Número de linhas historypermitidas 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 PS1variável de ambiente contém a definição do prompt de comando principal, padrão e. Um conjunto de tokens chamado 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 PS2variável de ambiente contém a definição desse prompt secundário, que, por padrão, é maior que o sinal ( >).
  • SHELLOPTS: opções de shell que você pode definir usando a setopção.
  • UID: O identificador de usuário do usuário atual.
Recomendado:  Como habilitar a criptografia de disco completo no Windows 10

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

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

echo $ BASH_VERSION em uma janela de terminal.

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 o diretório de trabalho atual.
  • \ u: o nome de usuário da pessoa que está conectada.
  • \ 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 historylista.
  • \ $: Define o caractere final do prompt como um cifrão ( $) para um usuário normal 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 PS1variável de ambiente em seu .bashrcarquivo.

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

Para criar variáveis ​​de ambiente para seu próprio uso, adicione-as ao final do  .bashrcarquivo. Se quiser que as variáveis ​​de ambiente estejam disponíveis para sessões remotas, como conexões SSH, você também precisará adicioná-las ao  .bash_profilearquivo.

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

gedit .bashrc

O arquivo .bashrc foi transferido para um editor e uma nova variável de ambiente adicionada como a última linha do arquivo.

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

gedit .bashrc em uma janela de terminal.

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 .bash_profile arquivo usando o comando dot ( .) como este:

. .bashrc

.  .bashrc em uma janela de terminal.

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

LOCAL_VAR = "Apenas esta sessão"

LOCAL_VAL = "Esta sessão apenas" em uma janela de terminal.

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

echo $ LOCAL_VAR em uma janela de terminal.

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

bash
echo $ LOCAL_VAR
echo $ INHERITED_VAR

bash em uma janela de terminal

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

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

echo $ INHERITED_VAR

echo $ INHERITED_VAR em uma janela de terminal.

Para fechar nossa bashsessão infantil , usamos exit:

Saída

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

Isso foi salvo em um arquivo chamado envtest.she, 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

./envtest.sh em uma janela de terminal.

O script pode ver a WEBSITEvariável de ambiente global e a INHERITED_VARvariável de ambiente exportada. Ele não pode acessar  LOCAL_VAR, embora o script esteja sendo executado no mesmo shell em que a variável foi criada.

Recomendado:  Como ver o histórico de edição de uma célula no Planilhas Google

Se precisarmos, podemos exportar uma variável de ambiente da linha de comando. Faremos isso no nosso LOCAL_VARe, em seguida, executaremos o script novamente:

exportar LOCAL_VAR
./envtest.sh

exportar LOCAL_VAR em uma janela de terminal.

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 adicioná-las ao seu .bash_profilearquivo. Você pode definir a mesma variável de ambiente nos arquivos .bashrc.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 .profilearquivo. Ele também pode conter definições de variáveis ​​de ambiente. No entanto, o .profilearquivo não é lido se o .bash_profilearquivo estiver presente. Portanto, a coisa mais segura a fazer – e da bashmaneira compatível – é para usar o .bash_profilearquivo.)

Para editar o .bash_profilearquivo, usaremos geditnovamente:

gedit .bash_profile

gedit .bash_profile em uma janela de terminal.

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

O arquivo .bash_profile aberto em um editor com uma nova variável de ambiente sendo incluída.

Salve suas alterações e feche gedit.

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

ssh dave@howtogeek.local

ssh dave@howtogeek.local em uma janela de terminal.

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

./envtest.sh

./envtest.sh em uma janela de terminal.

O .bash_profilearquivo foi lido como parte da inicialização do login remoto e a INHERITED_VARvariável de ambiente 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 unsetcomando . Se removermos a definição da variável de ambiente global  WEBSITE, e a variável de ambiente exportada,,  INHERITED_VARelas não estarão mais disponíveis na linha de comando, nem em processos filho:

cancelar WEBSITE
não definido INHERITED_VAR
./envtest.sh
echo $ WEBSITE

Desconfigurando uma variável de ambiente no Bash no Linux.

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 /etc/environmentarquivo durante seu processo de login e é independente da cópia de qualquer outra pessoa da variável.

Por exemplo, o usuário maryainda pode acessar a WEBSITEvariável de ambiente e ler seu valor, mesmo que o usuário a davetenha unsetem sua sessão:

echo $ WEBSITE

echo% WEBSITE em uma janela de terminal.

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 precisar gravá-los em um arquivo.