Saltar para o conteúdo
102 · LPIC-1 (parte 2)

105.1 Personalizar e trabalhar no ambiente shell

TópicoT01ObjetivoPersonalizar e trabalhar no ambiente shell de comandos LinuxPeso4PáginasLPIC-1 (102) - Version 5.0

Resumo Conciso

Tipos de shell

TipoDescriçãoExemplo
Interativo de loginLogin no sistemasu - user2, Ctrl+Alt+F2, ssh
Interativo sem loginShell aberto após loginbash, gnome-terminal, konsole
Não-interativo sem loginScripts executados./script.sh

Ficheiros de inicialização

ShellNível globalNível local (utilizador)
Login interativo/etc/profile, /etc/profile.d/*~/.bash_profile~/.bash_login~/.profile
Login interativo~/.bash_logout (ao sair)
Interativo sem login/etc/bash.bashrc~/.bashrc (→ ~/.bash_aliases)
Não-interativo sem loginBASH_ENV (variável)

Os ficheiros locais têm precedência sobre os globais. Quando vários ficheiros existem, o primeiro encontrado é executado e os restantes são ignorados.

Variáveis: local vs global

CaracterísticaVariável localVariável de ambiente
EscopoShell atualShell + processos filhos
ConvençãoMinúsculasMaiúsculas
Criarvar=valorexport var=valor
Listarset | lessexport, env, printenv
Removerunset varunset var
Imutávelreadonly varreadonly var

Comandos essenciais

ComandoFunção
bash -lShell de login
bash -iShell interativo
bash --noprofileIgnora /etc/profile e ficheiros de login do utilizador
bash --norcIgnora /etc/bash.bashrc e ~/.bashrc
bash --rcfile <file>Usa <file> como ficheiro de inicialização
su - userShell de login interativo como user
T17 sudo -iShell de login interativo como root
source ~/.bashrc / . ~/.bashrcExecuta o ficheiro no shell atual
echo $0Mostra o tipo de shell atual

Variáveis de ambiente comuns

VariávelFunção
PATHDirectórios de busca de executáveis (separados por :)
HOMEDirectório home do utilizador
USERNome do utilizador atual
SHELLCaminho do shell atual
PS1Prompt do shell
LANGIdioma do sistema
HISTSIZENº de comandos em memória
HISTFILEFicheiro de histórico (~/.bash_history)
DISPLAYServidor X (:0, :1, etc.)

Sourcing com . e source

  • . e source são sinónimos — executam um ficheiro no shell atual
  • Usado para aplicar alterações a ~/.bashrc sem reiniciar sessão
  • O directório /etc/skel é o modelo para novas contas de utilizador (SKEL)

Aliases e funções

RecursoAliasesFunções
Variáveis locaisSimSim
Variáveis de ambienteSimSim
Escapáveis com \SimNão
RecursivasSimSim
Com parâmetros posicionaisNão (pouco prático)Sim
sudo ssh user2@machine2SimSim
Ctrl+Alt+F2SimSim
su - user2SimSim
gnome-terminalSimNão
Um utilizador usa o konsole para iniciar sakuraSimNão
Um script chamado test.sh com echo $0NãoNão

Solução:

Shell iniciado com…Interativo?Login?echo $0
sudo ssh user2@machine2SimSim-bash
Ctrl+Alt+F2SimSim-bash
su - user2SimSim-bash
gnome-terminalSimNãobash
konsole → sakuraSimNão/bin/bash
test.shNãoNão./test.sh

Exercício Guiado 2 — Comandos su e sudo para shells específicos

Enunciado: Escreva os comandos su e sudo para lançar cada tipo de shell.

Shell desejadosusudo
Login interativo como user2su - user2 / su -l user2sudo su - user2
Login interativo como rootsu - root / su -sudo su - root / sudo -i
Sem login interativo como rootsu root / susudo su root / sudo -s
Sem login interativo como user2su user2sudo su user2 / sudo -u user2 -s

Exercício Guiado 3 — Ficheiros de inicialização por tipo de shell

Enunciado: Indique quais ficheiros são lidos para cada tipo de shell.

Tipo de shell/etc/profile/etc/bash.bashrc~/.profile~/.bashrc
Login interativo (user2)SimSimSimSim
Login interativo (root)SimSimSimSim
Sem login interativo (root)NãoSimNãoSim
Sem login interativo (user2)NãoSimNãoSim

Exercício Guiado 4 — Variáveis locais vs globais

Enunciado: Analise a atribuição de variáveis e indique se cada uma é Local ou Global:

ComandoLocalGlobal
debian=motherSimNão
ubuntu=deb-basedSimNão
mint=ubuntu-based; export mintNãoSim
export suse=rpm-basedNãoSim
zorin=ubuntu-basedSimNão

Exercício Guiado 5 — Variáveis de ambiente: significado

Enunciado: Interprete a saída de comandos com variáveis de ambiente:

ComandoSaídaSignificado
echo $HISTCONTROLignorebothComandos duplicados e os que começam com espaço não são salvos
echo ~/home/carolHOME de carol é /home/carol
echo $DISPLAYreptilium:0:2Servidor X na máquina reptilium, segunda tela
echo $MAILCHECK60Verificação de email a cada 60 segundos

Exercícios Exploratórios

Exercício Exploratório 1 — Verificar tipo de shell

Enunciado: Descubra em que tipo de shell está a trabalhar.

bash
echo $0
  • -bash ou -su → shell de login interativo
  • bash ou /bin/bash → shell interativo sem login
  • <nome_do_script> → shell não-interativo sem login
bash
# Ver shells bash em execução:ps aux | grep bash

Exercício Exploratório 2 — Função em ficheiro de inicialização

Enunciado: Crie uma função hello() que imprima "Hello world!" e faça-a persistir em ~/.bashrc.

bash
# Adicionar ao ~/.bashrc:echo 'hello() { echo "Hello world!"; }' >> ~/.bashrcsource ~/.bashrchello

Para tornar a função disponível: source ~/.bashrc ou . ~/.bashrc. Para invocar: hello. Para persistir entre sessões, colocar em ~/.bashrc (shell interativo sem login) ou /etc/bash.bashrc (para todos os utilizadores root).

Exercício Exploratório 3 — Sourcing sem reiniciar

Enunciado: Altere variáveis em ~/.bashrc e aplique as alterações sem reiniciar.

bash
# Duas formas de aplicar alterações:source ~/.bashrc# ou. ~/.bashrc

Ambos os comandos (source e .) executam o ficheiro no shell atual, aplicando imediatamente as alterações sem necessidade de logout/login.

Exercício Exploratório 4 — Criar ~/.bash_login para novos utilizadores

Enunciado: Como administrador, crie ~/.bash_login para todos os novos utilizadores do sistema.

bash
# Criar o ficheiro no directório skel:echo 'date' > /etc/skel/.bash_login

O directório /etc/skel é copiado para o directório home de cada novo utilizador. Colocar .bash_login em /etc/skel garante que todos os novos utilizadores o receberão automaticamente.

Exercício Exploratório 5 — Criar pasta ~/bin e adicionar ao PATH

Enunciado: Crie ~/bin, adicione-a ao PATH e torne a mudança persistente.

bash
mkdir ~/binPATH="$HOME/bin:$PATH"

Para persistir em ~/.profile:

bash
if [ -d "$HOME/bin" ] ; then    PATH="$HOME/bin:$PATH"fi

A declaração if verifica se ~/bin existe antes de adicionar ao PATH. Colocar em ~/.profile garante que é executado no login. Usar ~/.bashrc se preferir que aplique a todos os shells interativos.