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 é pós-produção ou pós-processamento em fotografia e videografia?

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 pregar a exposição no local ao tirar fotos

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 verificar se os backups do Time Machine do seu Mac estão funcionando corretamente

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.