A maioria da comunidade de tecnologia gosta de interagir com os sistemas por meio da interface de linha de comando (CMD) ou shell. Geralmente, isso facilita o trabalho deles. Por exemplo, você pode criar um comando shell que pode executar várias tarefas automaticamente, em vez de ter que clicar em vários botões de uma GUI.
Quando você inicia um programa shell ou CMD, ele compila várias informações. As informações definem como o programa acessa os recursos subjacentes do sistema, bem como o comportamento geral. Você pode armazená-las em um local chamado ambiente. O ambiente consiste em strings que representam pares de chave-valor. Neste tutorial, usaremos o Ubuntu 20.04 VPS como exemplo para guiá-lo na configuração de variáveis de ambiente ou de shell. O guia também deve se aplicar a outras distribuições Linux.
Qual é a diferença entre variáveis de ambiente e variáveis de shell?
Quando você inicia uma sessão, as informações são coletadas das configurações e arquivos de configuração do sistema. Em seguida, elas ficam disponíveis para o processo shell e seus processos filhos. Essas informações são um conjunto de pares chave-valor neste formato:
|
1 2 3 |
KEY=value KEY="Some value" KEY=data1:data2 |
Os nomes das variáveis, ou seja, as chaves, são sensíveis a maiúsculas e minúsculas. No entanto, é convencionalmente aceito tê-las em LETRAS MAIÚSCULAS. Isso ajuda a distingui-las em outros contextos. Com o caractere dois-pontos ‘:’, você pode atribuir vários valores à mesma variável. Também é importante garantir que não haja espaço ao redor do =. As chaves são as variáveis e são classificadas em duas: variáveis de ambiente e variáveis de shell. As Variáveis de Ambiente contêm todas as variáveis definidas em todo o sistema e disponíveis para todos os shells ou processos filhos. Elas ajudam a passar informações para os processos que você inicia por meio dos comandos do shell. Variáveis de Shell incluem apenas variáveis definidas na sessão específica do shell. Além disso, incluem apenas variáveis disponíveis exclusivamente dentro de sua instância de shell.
Listando variáveis de ambiente e de shell
Por padrão, o terminal fornece dois comandos para listar as variáveis de ambiente e de shell: env ou printenv. Eles mostram as mesmas informações em seu estado padrão. Aqui está um exemplo de saída desses comandos:
Usando env:

Usando printenv:

Como você pode ver, a saída é a mesma. O diferença surge quando você deseja o valor de uma chave específica. É aí que você usará o printenv com o nome da variável:

Para ver múltiplos valores, você pode passar mais de um argumento para o comando printenv. Os valores aparecerão na ordem em que você inseriu os argumentos:

Você também pode usar o comando echo com o nome da variável para exibir o valor de uma variável:

O comando env permite modificar o ambiente no qual os programas são executados, passando definições de variáveis em uma sintaxe como:
|
1 |
env VAR1="valor da var 1" comando_a_executar opcoes_do_comando |
Isso permite que você substitua valores ou defina novos valores que podem ser usados pelo processo filho. Os comandos printenv e env listam as variáveis de ambiente, conforme visto acima. Elas já estavam definidas para os processos do sistema. Se você quiser ver uma lista de variáveis de shell, pode usar o comando set. Digitar set sem nenhuma variável retornará uma lista de todas as variáveis de ambiente, variáveis de shell, variáveis locais e funções de shell:

As variáveis podem ser muitas. Se necessário, você pode paginá-las usando o comando:
|
1 |
set | less |
Você pode limpar ainda mais a saída especificando o comando set para ser executado em POSIX, evitando assim a impressão das funções do shell. Aqui executamos em um subshell (instância separada do processador de comandos) para evitar que o comando altere o ambiente atual:
|
1 |
(set -o posix; set) |
O comando acima lista todos os comandos de ambiente e de shell disponíveis no sistema. Você pode reduzir a saída usando o seguinte comando para tentar obter apenas as variáveis de shell:
|
1 |
comm -23 <(set -o posix; set | sort) <(env | sort) |
Uma saída de exemplo do comando acima é:

Embora o comando possa incluir algumas variáveis de ambiente, ele ajudará você a diferenciar entre as variáveis de shell e de ambiente. Isso ocorre porque o comando set coloca os valores das variáveis entre aspas, enquanto os comandos printenv e env não colocam os valores entre aspas. As variáveis de shell são úteis para definir valores persistentes para sessões, sem gravar permanentemente as alterações nos arquivos.
Variáveis de Ambiente Comuns
USER – O usuário atualmente conectado.
SHELL – O shell que interpretará os comandos que você inserir. O padrão é o bash, mas você pode alterar isso.
HOME – Diretório home do usuário atual.
TERM – Especifica o tipo de terminal a ser emulado. Mostra o terminal emulado atual.
PWD – O diretório de trabalho atual.
OLDPWD – O diretório de trabalho anterior. Isso ajuda o shell a alternar para o diretório anterior quando você insere o comando de mudança de diretório como cd.
EDITOR – O editor de arquivos padrão quando você digita edit no seu terminal.
LS_COLORS – Define os códigos de cores usados para adicionar saída colorida quando você insere o comando ls. Ajuda a diferenciar os tipos de arquivos e fornece informações aos usuários.
LOGNAME – O nome do usuário atual.
MAIL – Define o caminho para a caixa de correio do usuário atual.
LANG – Define a configuração de localidade atual.
PATH – Especifica uma lista de diretórios a serem pesquisados ao executar os comandos. Durante a execução de um comando, o sistema pesquisa nesses diretórios e usa o primeiro executável encontrado.
_ – O último comando executado.
Variáveis de Shell Comuns:
BASH_VERSION – A versão do bash, em saída legível por humanos.
BASH_VERSINFO – A versão do bash, em saída legível por máquina.
BASHOPTS – A lista de opções que foram usadas quando o bash foi executado. Útil para determinar se o ambiente do shell funcionará como você espera.
COLUMNS – O número de colunas de largura que estão sendo usadas para desenhar a saída na tela.
DIRSTACK – A pilha de diretórios que estão disponíveis com os comandos pushd e popd.
HOSTNAME – O nome de host do computador neste momento.
HISTFILESIZE – Número de linhas do histórico de comandos armazenadas em um arquivo.
HISTSIZE – Número de linhas do histórico de comandos permitidas na memória.
IFS – O separador de campos interno para separar a entrada na linha de comando. É um espaço por padrão.
SHELLOPTS-Usado para definir opções do shell.
UID-O UID do usuário atual.
PS1– A definição do prompt de comando principal. Isso é usado para definir a aparência do seu prompt quando você inicia uma sessão de shell.
PS2 – Declara prompts secundários para quando um comando se estende por várias linhas.
Setting Environmental and Shell Commands
Primeiro, como explicado anteriormente, manteremos os nomes das variáveis todos em maiúsculas. Em seguida, passaremos pela criação de variáveis de shell. Finalmente, criaremos variáveis de ambiente.
Criando Variáveis de Shell
Vamos começar com o habitual hello world. Insira o seguinte no seu terminal:
|
1 |
MY_FIRST_VAR=’Hello World!’ |
As aspas são usadas porque a variável tem espaço. Observe que usamos aspas simples porque o ponto de exclamação é um caractere especial e deve ser escapado ou colocado entre aspas simples. Agora, você criou sua primeira variável de shell. Ela está disponível apenas na sessão de shell atual. As variáveis de shell não estão disponíveis para shells e processos filhos. Você pode exibi-la no terminal usando o comando set com grep:

Or display the value using echo, referencing it using the $ sign and the variable name:

Se você tentar exibir usando printenv, não verá nenhuma saída. Isso ajuda a confirmar que esta não é uma variável de ambiente:

Criando Variáveis de Ambiente
A variável de shell criada anteriormente pode ser transformada em uma variável de ambiente usando o comando export. Primeiro, você cria uma variável de shell. Depois, para criar uma variável de ambiente, você precisa usar o comando export. Após a execução deste comando, a variável estará disponível para shells e processos filhos:
|
1 |
export MY_FIRST_VAR |
Agora, se você testar usando o comando printenv, deverá ver a variável e o valor:

Você também pode criar uma variável de ambiente em uma única etapa usando a sintaxe:
|
1 |
export MY_SECOND_VAR='Esta é a minha segunda variável' |
As variáveis de ambiente são passadas apenas para os shells filhos e não para o pai. Isso ajuda a evitar que os processos filhos afetem o ambiente do programa que os chamou.
Despromovendo e Desdefinindo Variáveis
Se você tem acompanhado o tutorial até este momento, então você ainda tem a MY_FIRST_VAR definida como uma variável de ambiente. Você pode alterá-la de volta para uma variável de shell digitando o comando echo com a flag –n:
|
1 |
export -n MY_FIRST_VAR |
Se você testar com o printenv, não haverá saída. No entanto, o comando echo irá exibi-la porque ela ainda é uma variável de shell:

Você pode remover a definição de uma variável de shell ou de ambiente usando o comando unset. E você pode confirmar que ela não existe mais usando o echo. Como você pode ver, ele não mostra nenhuma saída:

Configurando Variáveis de Ambiente no Login
Muitos programas dependem de variáveis de ambiente para execução. Como não é eficiente configurar as variáveis toda vez que você deseja executar um programa, o Linux oferece uma maneira de defini-las e salvá-las em um arquivo. Dessa forma, elas podem ser configuradas automaticamente no momento do login. O shell lê diferentes arquivos de configuração dependendo de como a sessão é iniciada. Eles são discutidos abaixo:
Tipos de Sessões de Shell e suas Diferenças
- Sessão de Shell de Login – começa autenticando o usuário. A sessão é definida quando você entra via SSH ou sessão de terminal.
- Sessão de Shell sem Login – começa quando você inicia um novo shell de dentro do seu shell autenticado. Você pode iniciar um novo shell usando o comando bash. Não são necessários detalhes de autenticação.
- Sessão de Shell Interativa – uma sessão de shell anexada a uma sessão de terminal.
- Sessão de Shell Não Interativa – uma sessão de shell não anexada a uma sessão de terminal – roda em segundo plano.
Uma sessão é classificada como de login ou sem login, e como interativa ou não interativa. Quando você faz login e inicia uma sessão de shell via SSH, essa será uma sessão de shell de login e interativa. Quando você executa um script no terminal, ele geralmente roda em uma sessão sem login e não interativa. Uma sessão de shell também pode ser uma combinação das duas. Então, qual arquivo de configuração é escolhido?
Uma sessão de login lê primeiro os arquivos de configuração do diretório /etc/profile. Em segundo lugar, ela verifica os arquivos de configuração específicos do usuário no diretório home do usuário. Apenas o primeiro arquivo encontrado entre ~/.bash_profile, ~/.bash_login e ~/.profile é lido e todos os outros arquivos são ignorados. Uma sessão sem login lerá primeiro o /etc/bash.bashrc, seguido pelo ~/.bashrc. As sessões não interativas leem a variável de ambiente chamada BASH_ENV para obter o nome do arquivo a ser usado para definir o novo ambiente.
Implementando Variáveis de Ambiente
Ao configurar suas variáveis, sempre observe em qual arquivo você as coloca com base em nossa discussão acima. Isso proporcionará flexibilidade, garantindo que certas variáveis estejam disponíveis apenas em certas sessões. Você não vai querer que uma variável crucial falte em uma sessão.
Em alguns casos, queremos que a variável exista em sessões de login e sem login. Felizmente, a maioria das distribuições Linux, por padrão, configurou as configurações de login para ler as configurações sem login e disponibilizá-las para seus processos. Portanto, você pode simplesmente definir suas variáveis nos arquivos de configuração sem login. Geralmente, configuramos variáveis de ambiente específicas do usuário e queremos que nossas configurações estejam disponíveis tanto nas sessões de shell de login quanto nas sem login. Por esse motivo, usaremos o arquivo ~/.bashrc. Usaremos o nano para editar o arquivo. Digite o seguinte em seu terminal para abrir o arquivo:
|
1 |
nano ~/.bashrc |
No arquivo de configuração aberto, você já pode ver várias variáveis. Você pode adicionar variáveis de ambiente da mesma forma que faz ao usar a linha de comando. Basta digitar o comando:
|
1 |
export KEYNAME=value. |
Você pode adicioná-las em qualquer lugar do arquivo - em uma nova linha, e não dentro de uma função de loop. Em seguida, salve e feche o arquivo. Qualquer próxima sessão de shell que você iniciar lerá a partir do arquivo. Se você quiser que o shell atual leia as configurações que acabou de adicionar sem ter que reiniciá-lo, você pode usar o comando:
|
1 |
source ~/.bashrc |
Você deve adicionar variáveis de ambiente de todo o sistema em qualquer um dos seguintes: /etc/profile, /etc/bash.bashrc ou /etc/environment.
Resumindo
Finalmente, agora você pode definir variáveis de shell e de ambiente e aproveitar o grande poder que essas ferramentas trazem para o seu VPS! Isso tem muitas vantagens, como automatizar a execução de alguns processos, ou a configuração de implantação automática que requer informações de autenticação, passar variáveis para processos filhos e muito mais. As variáveis de ambiente ajudam a ocultar dados confidenciais, como informações de autenticação, de repositórios públicos, entre outros dados. Com essa base, você pode criar scripts complexos que pode executar automaticamente através da linha de comando sem exigir a entrada constante do usuário.
Boa computação!
Comentários
Nenhum comentário ainda. Seja o primeiro.