Comando set / unset no Linux (variáveis e funções do Shell) [Guia Básico]

O comando set informa uma lista de todas as variáveis locais, variáveis ambientais e funções do shell.

Algumas opções do comando set alteram o comportamento do bash, a saber:

  • -C Previnem que a saída de um programa usando `>’, `>&’ e `<>’ regrave arquivos. Faz o mesmo que a opção -o noclobber 
  • -n Lê os comandos, mas não os executa. Útil para checar scripts. Faz o mesmo que a opção -o noexec
  • -P Proíbe o shell de seguir links simbólicos. Faz o mesmo que a opção -o physical
  • -a Marca as variáveis modificadas ou criadas para export. Faz o mesmo que a opção -o allexport
  • -o history Habilita guardar o histórico de comandos digitados.
  • -x Mostra o comando digitado e seu resultado
  • -m Habilita o controle de Tarefas (Jobs)
  • -e Sai do shell assim que o comando executado terminar com êxito
  • -n Lê os comandos, mas não os executa. Faz o mesmo que a opção -o noexec
  • -f Desabilita o uso de coringas * e ?. Faz o mesmo que a opção -o noglob

Ao utilizar as opções do set, o símbolo + pode ser utilizado para desabilitar as opções.

Esse comando além de servir para listar todas as variáveis, ele pode alterar o comportamento do bash.

Veja os exemplos:

Listar as variáveis:

$ set
BASH=/bin/bash
BASH_VERSION='4.2.46(2)-release'
HISTCONTROL=ignoredups
HISTFILE=/home/ec2-user/.bash_history

No Clobber (não sobrescreva)

Para não permitir que um arquivo seja regravado com o condutor “>””

$ set -C
$ cat teste.c > texto
-bash: texto: cannot overwrite existing file

Imprimir o que for digitado

Para imprimir o comando digitado e seu resultado:

$ set -x
$ echo $TERM
+ echo xterm-256color
xterm-256color

Para desabilitar isso, podemos usar a opção com o +x:

$ set +x

Sem History

Para evitar que os comandos digitados sejam gravados no history, podemos usar a opção +o history:

$ set +o history

Para voltar a gravar os comandos digitados no history:

$ set -o history

Observe a pegadinha que algumas opções são ativadas com o “-” e outras desativadas com o “+” antes da opção. 

No glob (sem coringas)

Para evitar que o Bash faça uso de coringas, pode-se usar a opção -f ou -o noglob:

$ ls /bin/zip*
/bin/zip  /bin/zipcloak  /bin/zipgrep  /bin/zipinfo  /bin/zipnote  /bin/zipsplit
$ set -f
$ ls /bin/zip*
ls: não é possível acessar /bin/zip*: No such file or directory

É quase certo que as opções -C (noclobber) e -f (noglob) serão questões de prova na LPI. 

É importante que você saiba que as opções que alteram o comportamento do comando set não são permanentes se não estiverem em algum script de inicialização do bash. Algumas distribuições customizam o comportamento do shell com o comando set nos arquivos /etc/profile ou /etc/bashrc.

Comando unset

O comando unset apaga uma variável ambiental da memória.

Ex.:

$ LIVRO="Certificação Linux"
$ echo $LIVRO
Certificação Linux
$ unset LIVRO
$ echo $LIVRO

Comando printenv

O comando printenv imprime as variáveis ambientais.

Como parâmentro pode receber o nome de uma variável.

Exemplo:

$ printenv PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/bin

Se não for informado nenhum parâmetro, imprime todas as variáveis ambientais.

Somente as variáveis exportadas com o comando export são impressas pelo printenv.

Veja o exemplo:

$ BOOK="Certificação CompTIA Linux"
$ printenv BOOK

Se a variável BOOK for exportada:

$ export BOOK
$ printenv BOOK
Certificação CompTIA Linux

Comando export

O comando export serve para exportar as variáveis criadas para todos os processos filhos do Bash (programas).

Essa exportação é para uma área de memória especial compartilhada entre o Bash e os programas que o Shell executa.

Se não for informada uma variável ou função como parâmetro, ele mostra todas as variáveis exportadas. Ele também pode ser usado para se criar uma variável e exporta-la ao mesmo tempo.

Uma variável criada no bash sem ser exportada não pode ser lida por nenhum processo ou programa executado no mesmo terminal ou sessão do Shell.

Exemplo de como criar diretamente uma variável e exportar ao mesmo tempo:

$ export LIVRO="Certificação Linux"
$ export
declare -x LIVRO="Certificação Linux"
( ... )

Para ilustrar bem isso, vamos criar uma variável com o meu nome:

$ NOME="Uirá Ribeiro"

No próprio shell, pode-se ver o seu conteúdo com o  comando echo:

$ echo $NOME
Uirá Ribeiro

Observe que, enquanto não exportarmos a variável NOME com o comando export, ela não ficará disponível para nenhum programa ou script de shell executado.

Por exemplo, se criarmos um script chamado meunome.sh com o seguinte conteúdo:

#!/bin/bash
echo “Meu nome é $NOME”

Para executar o script meunome.sh, é preciso alterar as permissões para execução:

$ chmod +x meunome.sh

Ao executar o meunome.sh, ele não irá conseguir ler o conteúdo da variável NOME que foi criada anteriormente no shell:

$ ./meunome.sh
Meu nome é

Mas se a variável NOME for exportada:

$ export NOME

Se executarmos novamente o meunome.sh:

$ ./meunome.sh
Meu nome é Uirá Ribeiro

O comando export possibilitou que a variável NOME ficasse disponível para todos os comandos e programas executados pelo shell que está em execução, ou seja, para todos os processos filhos deste shell.

Para ficar bem claro, outro shell executado em outro terminal ou sessão não conseguirá ler a variável NOME, porque ela não está em nenhum script de perfil ou de carga do Bash.

Aprenda muito mais sobre Linux em nosso curso online. Você pode efetuar a matrícula aqui. Se você já tem uma conta, ou quer criar uma, basta entrar ou criar seu usuário aqui.

Gostou? Compartilhe