Gerenciar o Ambiente e a Configuração do Shell no Linux

CompTIABeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá os fundamentos do gerenciamento do ambiente e da configuração do shell no Linux. Você começará criando variáveis locais e de ambiente, utilizando comandos como echo, export e env para compreender as principais diferenças em seus escopos e disponibilidades dentro de uma sessão de shell.

Com base nesses fundamentos, você explorará como variáveis e aliases são herdados por shells filhos. Também aprenderá a controlar a exportação automática de variáveis com a opção set -o allexport e como tornar suas configurações personalizadas persistentes entre diferentes sessões ao modificar o arquivo .bashrc.

Criar e Diferenciar Variáveis Locais e de Ambiente

Nesta etapa, você aprenderá a criar e gerenciar variáveis de shell. Em um shell Linux como o Zsh, as variáveis são usadas para armazenar informações. Existem dois tipos principais: variáveis locais e variáveis de ambiente.

  • Uma variável local (ou variável de shell) está disponível apenas dentro do shell onde foi criada.
  • Uma variável de ambiente está disponível não apenas no shell atual, mas também em quaisquer processos filhos iniciados a partir desse shell.

Usaremos comandos como echo, export e env para trabalhar com elas. Todos os comandos serão executados no terminal.

Primeiro, vamos criar uma variável local. No seu terminal, que já está no diretório ~/project, digite o seguinte comando para criar uma variável chamada flower e atribuir a ela o valor rose. Observe que não deve haver espaços ao redor do sinal de igual (=).

flower=rose

Para verificar se a variável foi criada, você pode usar o comando echo para exibir seu valor. O cifrão ($) antes do nome da variável instrui o shell a substituir a variável pelo seu respectivo valor.

echo $flower

Você deverá ver o valor da variável impresso no terminal:

rose

Agora, vamos verificar se esta variável local faz parte do ambiente do shell. O comando env lista todas as variáveis de ambiente. Podemos direcionar sua saída para o grep para procurar por nossa variável.

env | grep flower

Este comando não produzirá nenhuma saída. Este é o resultado esperado e confirma que flower é uma variável local, não uma variável de ambiente.

Em seguida, vamos criar uma variável de ambiente. O processo é semelhante, mas usamos o comando export. Este comando cria uma variável e a marca para ser transmitida a todos os processos filhos do shell atual. Vamos criar uma variável de ambiente chamada nut com o valor almond.

export nut=almond

Vamos verificar com o echo assim como fizemos anteriormente.

echo $nut

O comando exibirá o valor da variável nut:

almond

Agora, vamos verificar se ela existe no ambiente usando o comando env novamente.

env | grep nut

Desta vez, o comando encontra e exibe a variável, confirmando que nut é uma variável de ambiente:

nut=almond

Você criou com sucesso tanto uma variável local quanto uma de ambiente e viu a diferença fundamental em como elas são tratadas pelo ambiente do shell. Manteremos essas variáveis definidas para uso nas próximas etapas.

Testar a Herança de Variáveis e Aliases em um Shell Filho

Nesta etapa, você explorará como variáveis e aliases se comportam quando você inicia um novo shell a partir do atual. Este novo shell é chamado de "shell filho" (child shell), e o shell original é o "shell pai" (parent shell). Este conceito é crucial para entender como os ambientes de shell são estruturados e como os scripts são executados. Testaremos se as variáveis flower e nut da etapa anterior são transmitidas, ou "herdadas", por um shell filho.

Primeiro, vamos identificar o ID do Processo (PID) do nosso shell pai atual. Cada processo no Linux possui um PID exclusivo. Você pode visualizá-lo com o comando echo $$.

echo $$

Sua saída será um número, que é o PID do seu shell atual. Por exemplo:

123

Agora, inicie um shell filho simplesmente digitando zsh e pressionando Enter. Isso cria um novo processo de shell dentro do atual.

zsh

Você está agora em uma nova sessão de shell. Para confirmar isso, podemos usar o comando ps -f, que mostra informações detalhadas do processo, incluindo o ID do Processo Pai (PPID).

ps -f

Observe a saída. Você verá dois processos zsh. O PID do novo processo zsh deve ter um PPID que corresponda ao PID do shell pai que você anotou anteriormente.

UID          PID    PPID  C STIME TTY          TIME CMD
labex        123       1  0 10:00 pts/0    00:00:00 zsh
labex        456     123  0 10:01 pts/0    00:00:00 zsh
labex        457     456  0 10:01 pts/0    00:00:00 ps -f

Neste exemplo, o novo shell (PID 456) é um filho do shell original (PPID 123).

Agora, vamos testar as variáveis. Neste shell filho, tente exibir o valor da variável local flower.

echo $flower

O comando não produz saída. Isso ocorre porque as variáveis locais estão restritas ao shell em que foram criadas e não são herdadas por shells filhos.

Em seguida, verifique a variável de ambiente nut.

echo $nut

Desta vez, o shell imprime o valor da variável:

almond

Isso demonstra que as variáveis de ambiente, ao contrário das variáveis locais, são herdadas pelos shells filhos.

Agora, vamos retornar ao shell pai usando o comando exit.

exit

Você está de volta ao seu shell original. Vamos realizar um teste semelhante com um alias. Um alias é um atalho para um comando. Crie um alias chamado ldetc que executa ls -ld /etc.

alias ldetc='ls -ld /etc'

Verifique se o alias foi criado digitando alias.

alias ldetc

Você deverá ver a definição do seu alias:

ldetc='ls -ld /etc'

Agora, teste o alias executando-o.

ldetc

O comando executará ls -ld /etc e mostrará os detalhes do diretório /etc.

drwxr-xr-x 1 root root 4096 Oct 10 10:00 /etc

Agora, abra outro shell filho para ver se o alias é herdado.

zsh

Dentro do novo shell filho, tente usar o alias ldetc.

ldetc

Você receberá uma mensagem de erro, pois os aliases, assim como as variáveis locais, não são herdados por shells filhos.

zsh: command not found: ldetc

Retorne ao shell pai.

exit

Por fim, vamos fazer uma limpeza removendo o alias do shell pai usando o comando unalias.

unalias ldetc

Verifique a remoção tentando listá-lo novamente.

alias ldetc

Nada é retornado.

Este exercício mostrou um princípio fundamental do comportamento do shell: variáveis de ambiente são herdadas por processos filhos, mas variáveis locais e aliases não são.

Controlar a Exportação Automática de Variáveis com set -o allexport

Nesta etapa, você aprenderá sobre uma poderosa opção de shell chamada allexport. Normalmente, ao criar uma variável, você deve usar explicitamente o comando export para torná-la uma variável de ambiente. No entanto, ao habilitar a opção allexport, você instrui o shell a exportar automaticamente cada nova variável que você definir. Isso pode ser um atalho conveniente, especialmente em scripts onde todas as variáveis precisam estar disponíveis para subprocessos.

As opções de shell são configurações internas que alteram o comportamento do seu shell. Você pode ativá-las com set -o [nome_da_opcao] e desativá-las com set +o [nome_da_opcao].

Primeiro, vamos verificar o status atual da opção allexport. Você pode listar todas as opções do shell e filtrar por allexport usando o grep.

set -o | grep allexport

Por padrão, esta opção está desativada. A saída mostrará seu status como off:

allexport              off

Agora, vamos ativar a opção allexport.

set -o allexport

Verifique se a configuração mudou executando o comando de verificação novamente.

set -o | grep allexport

Desta vez, a saída confirmará que a opção está on:

allexport              on

Com o allexport ativado, qualquer variável que você criar se tornará automaticamente uma variável de ambiente. Vamos testar isso. Crie uma nova variável chamada truck sem usar o comando export.

truck=chevy

Agora, verifique se truck existe no ambiente usando o comando env.

env | grep truck

Você verá que a variável truck está listada, mesmo que você não tenha usado o export. Isso ocorre porque a opção allexport estava ativa.

truck=chevy

Este recurso pode ser muito útil, mas é uma boa prática desativá-lo quando não for mais necessário para evitar a exportação não intencional de variáveis. Vamos desativar o allexport.

set +o allexport

Por fim, verifique se ele foi desativado.

set -o | grep allexport

A saída mostrará novamente que a opção está off.

allexport              off

Quaisquer novas variáveis que você criar a partir deste ponto serão variáveis locais por padrão, a menos que você use explicitamente o comando export.

Persistir Opções do Shell Usando o Arquivo .bashrc

Nesta etapa, você aprenderá como tornar permanentes as customizações do seu shell. Quaisquer aliases, funções ou opções de shell que você definir são temporários e serão perdidos quando você fechar sua sessão de terminal. Para salvá-los permanentemente, você precisa adicioná-los a um arquivo de configuração do shell.

Embora o título mencione o .bashrc, que é o arquivo de configuração do shell Bash, nosso ambiente de laboratório utiliza o shell Zsh. O arquivo de configuração equivalente para o Zsh é o ~/.zshrc. Este arquivo é um script que roda automaticamente toda vez que você abre um novo shell interativo, tornando-o o lugar perfeito para armazenar suas configurações pessoais.

Praticaremos isso tornando a opção de shell noclobber permanente. A opção noclobber evita que você sobrescreva acidentalmente um arquivo existente ao usar o redirecionamento de saída (>).

Primeiro, vamos usar o editor de texto nano para adicionar a opção noclobber ao seu arquivo ~/.zshrc. O símbolo ~ é um atalho para o seu diretório pessoal (home), /home/labex.

nano ~/.zshrc

Este comando abre o arquivo ~/.zshrc no editor nano. Use as teclas de seta para mover o cursor até o final do arquivo e adicione a seguinte linha:

set -o noclobber

Agora, salve o arquivo e saia do nano. Para fazer isso, pressione Ctrl+O (Write Out), pressione Enter para confirmar o nome do arquivo e, em seguida, pressione Ctrl+X para sair.

Você está de volta ao prompt de comando. Vamos verificar se a opção noclobber está ativa no seu shell atual.

set -o | grep noclobber

A saída será:

noclobber              off

Por que está desligada? Porque sua sessão de shell atual ainda não leu as alterações que você acabou de fazer no arquivo ~/.zshrc. O arquivo só é lido quando um novo shell é iniciado.

Para provar isso, vamos iniciar um novo shell filho.

zsh

Você está agora em um novo shell. Vamos verificar o status do noclobber aqui.

set -o | grep noclobber

Desta vez, a saída será:

noclobber              on

Isso confirma que os novos shells leem corretamente o arquivo ~/.zshrc e aplicam as configurações. Agora, saia do shell filho para retornar ao seu shell pai original.

exit

Então, como você pode aplicar as alterações ao seu shell atual sem fechá-lo e reabri-lo? Você pode usar o comando source, que lê e executa os comandos de um arquivo no contexto do shell atual.

source ~/.zshrc

O comando source agora executou a linha set -o noclobber do seu arquivo de configuração. Vamos verificar se o noclobber está agora ativado em nosso shell original.

set -o | grep noclobber

A saída agora será:

noclobber              on

Você aprendeu com sucesso como persistir as configurações do shell editando o arquivo ~/.zshrc e como aplicar essas alterações à sua sessão atual usando o comando source.

Resumo

Neste laboratório, você aprendeu os conceitos fundamentais do gerenciamento do ambiente do shell Linux. Você praticou a criação de variáveis locais, que ficam restritas ao shell atual, e variáveis de ambiente, que são herdadas por quaisquer processos filhos. Comandos essenciais como echo para exibir valores de variáveis, export para criar variáveis de ambiente e env para listá-las foram utilizados. O conceito de herança foi explorado mais a fundo ao iniciar um shell filho para testar quais variáveis e aliases foram transmitidos com sucesso a partir do shell pai.

Além disso, você explorou métodos para controlar e persistir a configuração do seu shell. Utilizou a opção set -o allexport para exportar automaticamente todas as variáveis definidas subsequentemente, agilizando o processo de torná-las disponíveis para processos filhos. Para garantir que suas variáveis personalizadas, aliases e opções de shell estejam disponíveis em todas as futuras sessões de terminal, você aprendeu como adicionar essas configurações ao arquivo de inicialização .bashrc (ou .zshrc), tornando as customizações do seu ambiente permanentes.