Como definir variáveis de ambiente em Bash no Linux

  • Dave McKay

    @TheGurkha

  • >li>28 de Abril de 2020, 8:00am EDT

Um terminal Linux estilizado com linhas de texto verde num portátil.
fatmawati achmad zaenuri/

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.

Publicidade

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

Publicidade

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

echo $SHELL numa janela terminal

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

sudo gedit /etc/environment in a terminal window

Advertisement

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 (").

O ficheiro /etc/ambiente aberto num editor e sendo adicionada uma nova variável de ambiente.

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

echo $WEBSITE numa janela terminal.

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

Publicidade

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

printenv | sort | less in a terminal window.

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

lista ordenada de variáveis de ambiente em menos numa janela terminal.

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

printenv | grep GNOME numa janela de terminal.

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

Anúncio

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

.ficheiro bashrc alojado num editor e uma nova variável de ambiente adicionada como última linha no ficheiro.

Publicidade

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

gedit .bashrc numa janela terminal.

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

. .bashrc numa janela terminal.

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

LOCAL_VAR="This session only"

LOCAL_VAL="Apenas esta sessão" numa janela terminal."This session only" in a terminal window.

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

echo $LOCAL_VAR numa janela de terminal.

Anúncio

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

bash numa janela terminal

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

echo $INHERITED_VAR numa janela terminal.

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
Anúncio

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

./envtest.sh numa janela terminal.

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

exportar LOCAL_VAR numa janela terminal.

Publicidade

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

gedit .bash_profile numa janela terminal.

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

>The .bash_profile file opened in an editor with a new environment variable being added.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.

Publicidade

Em outro computador, faremos uma ligação SSH ao computador de teste.

ssh [email protected]

ssh dave@howtogeek.local numa janela terminal.

Após estarmos ligados, executaremos o script mais uma vez:

./envtest.sh

./envtest.sh numa janela terminal.

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

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

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.

Publicidade

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

echo %WEBSITE numa janela terminal.

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
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 ”

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *