Skip to main content

105.1 Customizando e usando Ambiente Shell



O shell é indiscutivelmente a ferramenta mais poderosa em um sistema Linux e pode ser definido como uma interface entre o usuário e o kernel do sistema operacional. Ele interpreta comandos inseridos pelo usuário. Portanto, todos os administradores de sistema devem ter habilidade para usar o shell. Como certamente já sabemos, o Bourne Again Shell (Bash) é o shell de fato para a grande maioria das distribuições Linux.

Uma vez iniciado, a primeira coisa que o shell faz é executar uma série de scripts de inicialização. Esses scripts personalizam o ambiente da sessão. Existem scripts para todo o sistema e scripts específicos do usuário. Podemos colocar nossas preferências ou configurações pessoais que melhor atendam às necessidades de nossos usuários nesses scripts na forma de variáveis, apelidos e funções.


A série exata de arquivos de inicialização depende de um parâmetro muito importante: o tipo de shell.



Interativo vs não Interativo, Login vs não Login


Para começar, vamos esclarecer os conceitos de interativo e login no contexto de shells:

  • Shells interativos / não interativos

    Este tipo de shell se refere à interação que ocorre entre o usuário e o shell: O usuário fornece entrada digitando comandos no terminal usando o teclado; o shell fornece saída imprimindo mensagens na tela.

  • Shells de login / não login

    Este tipo de shell se refere ao evento de um usuário acessando um sistema de computador fornecendo suas credenciais, como nome de usuário e senha.

Os shells interativos e não interativos podem ser de login ou não de login e qualquer combinação possível desses tipos tem seus usos específicos.


Os shells de login interativos são executados quando os usuários fazem login no sistema e são usados para personalizar as configurações dos usuários de acordo com suas necessidades. Um bom exemplo desse tipo de shell seria o de um grupo de usuários pertencentes ao mesmo departamento que precisam de uma determinada variável definida em suas sessões.


Por shells sem login interativos, nos referimos a quaisquer outros shells abertos pelo usuário após o login no sistema. Os usuários usam esses shells durante as sessões para realizar tarefas de manutenção e administrativas, como definir variáveis, o tempo, copiar arquivos, escrever scripts, etc.


Por outro lado, shells não interativos não requerem nenhum tipo de interação humana. Assim, esses shells não pedem entrada do usuário e sua saída (se houver) é na maioria dos casos gravada em um log.



Arquivos de inicialização do Shell


Vamos ver os arquivos que podemos usar para estar configurando certos aspectos do nosso Shell, como explicado mais acima (indiretamente), temos 2 tipos de configuração de inicialização.


Ao fazermos login no Linux estamos fazendo a abertura de um Shell (nem sempre que abrirmos um Shlell irá significar que fizemos login) e ao abrirmos um terminal estamos abrindo um Shell mas sem login.
Veja os tipos de configuração para inicialização:
  • Nível Global

    Configuração que acontece para todos os usuários.

    • /etc/profile Este é o arquivo .profile de todo o sistema para o shell Bourne e shells compatíveis com Bourne (bash incluído). Por meio de uma série de instruções if, esse arquivo define várias variáveis, como PATH, UMASK, HISTSIZE e irá executar o /etc/bashrc ou /etc/bash.bashrc, de acordo com a origem (se houver), tanto do arquivo /etc/bash.bashrc quanto daqueles no diretório /etc/profile.d. Esse arquivo é executado sempre que fazemos login.

    • /etc/profile.d/*

      Este diretório pode conter scripts que são executados por /etc/profile.

    • /etc/bash.bashrc ou /etc/bashrc

      Usado para iniciar variáveis do Shell quando usado como terminal, vai carregar PS1, tipo de Shell entre outras coisas, esse aquivo é carregado através do /etc/profile.

      Esse arquivo é carregado sempre que for aberto um terminal (Abrir uma nova sessão), se apenas fizermos login, quem será carregado é o profile.

    • /etc/inputrc

      Definições do terminal, por exemplo, ao digitar CTRL+8 o que vai acontecer.


  • Nível Local

    As configurações nesse nível acontecem apenas para os usuários que a fizer e não para todos os usuários.

    • ~/.bash_profile Este arquivo é específico do Bash, ele é usado para configurar o ambiente do usuário. Ele também pode ser usado para originar ~/.bash_login e ~/.profile.

    • ~/.bash_login

      Também é específico do Bash, este arquivo só será executado se não houver um arquivo ~/.bash_profile. Seu nome sugere que deve ser usado para executar comandos necessários no login.

    • ~/.profile

      Este arquivo não é específico do Bash, ele é originado apenas se nem ~/.bash_profile nem ~/.bash_login existirem (o que normalmente é o caso). Portanto, o objetivo principal de ~/.profile é verificar se um shell Bash está sendo executado e se estiver, fornecer ~/.bashrc se ele existir. Geralmente define a variável PATH para que inclua o diretório ~/bin privado do usuário, se existir.

    • ~/.bash_logout Se existir, este arquivo é específico do Bash, ele executa algumas operações de limpeza ao sair do shell. Isso pode ser conveniente em casos como aqueles em sessões remotas.


Resumo da ordem de execução de arquivos locais:

  • 1° - bash_profile
  • 2° - bash_login
  • 3° - profile

Resumo:

  • ~/bashrc

    Usado ao abrir um novo Shell. É carregado normalmente, mas o ~/.bash_profile também carrega ele.



Source


Usado para recarregar um script ou arquivo de inicialização localmente, por exemplo, ao invés de abrirmos um novo Shell para carregar uma configuração que modificamos, podemos usar o comando source e essa mudança irpá acontecer no Shell atual que estivermos.


Podemos usar um . no lugar do source que funciona também.

$ source ~/.bashrc

$ . ~/.bashrc

Em scripts sua funcionalidade é a mesma, importanto o que quer que seja para o Shell em execução no momento.


Segue um script para demonstrar:

# Crie o script:
$ vim script-1.sh


########## Coloquei a saída abaixo no script ##########
source dados.txt

echo "Nome: $nome
Sobrenome: $sobrenome
"
########## Fim script ##########

# Agora crie um arquivo chamado dados.txt
$ vim dados.txt

########## Coloque a saída ##########
nome=joao
sobrenome=silva
########## Fim saída ##########

# Adicione a permissão de execução no script:
$ chmod +x script-1.s

# Rode o script:
$ ./script-1.sh
Nome: joao
Sobrenome: silva

Perceba que graças ao source, ele pode importar as variáveis de dados.txt para o Shell do script, se trocarmos source por . (ponto) , o resultado é o mesmo, outra forma de fazer isso, seria criar dados.txt como script, fazer o script-1.sh rodar o script dados.txt e no dados.txt exportar as variáveis para que o script-1.sh possa importar essas variáveis, perceba como é muito mais fácil usar o source em script e fora deles.



ALIAS


Já falamos sobre Alias, veja aqui.



FUNCTIONS


Funções são pedaços de códigos que podemos reutilizar para não termos que reescrever todo o código novamente, é muito usado em scripts, ma fora deles, podemos definir funções também, é uma alternativa para não ter que criar scripts, podemos colocar funções em muitos lugares, mas um recomendado é o arquivo ~/.bash_aliases.



A origem dos arquivos de inicialização do Shell: SKEL


SKEL é uma variável cujo valor é o caminho absoluto para o diretório skel. Este diretório serve como modelo para a estrutura do sistema de arquivos dos diretórios pessoais dos usuários. Inclui os arquivos que serão herdados por qualquer nova conta de usuário criada (incluindo, é claro, os arquivos de configuração para shells). SKEL e outras variáveis relacionadas são armazenadas em /etc/adduser.conf, que é o arquivo de configuração para adduser:

# Não vai ter em todas as distros:
$ grep SKEL /etc/adduser.conf
# The SKEL variable specifies the directory containing "skeletal" user
SKEL=/etc/skel
# If SKEL_IGNORE_REGEX is set, adduser will ignore files matching this
SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"

SKEL é definido como /etc/skel, assim, os scripts de inicialização que configuram nossos shells estão lá:

$ ls -a /etc/skel/
. .. .bash_logout .bashrc .config .gtkrc-2.0 .gtkrc-xfce .local .profile