Nesta aula, vamos explorar como personalizar o ambiente do shell Bash no Linux. A configuração adequada do ambiente pode aumentar significativamente sua produtividade, permitindo atalhos, funções personalizadas e um prompt mais informativo. Entenderemos os arquivos de inicialização do Bash, como criar aliases e funções, e como ajustar o PS1 para exibir o que você precisa.

O Bash é o shell padrão na maioria das distribuições Linux. Quando você abre um terminal, ele lê arquivos de configuração que definem variáveis, aliases, funções e a aparência do prompt. Dominar essas configurações é essencial para qualquer usuário que passa horas no terminal.

.bashrc vs .bash_profile

O Bash lê diferentes arquivos de inicialização dependendo se a shell é interativa ou de login. Os dois principais são .bashrc e .bash_profile, ambos localizados no diretório home do usuário.

.bash_profile é executado para shells de login (por exemplo, ao fazer login no sistema via console ou SSH). .bashrc é executado para shells interativas não-login (por exemplo, ao abrir um novo terminal em um ambiente gráfico). Muitas distros configuram .bash_profile para chamar .bashrc explicitamente, garantindo que as configurações sejam aplicadas em ambos os casos.

Para garantir que suas configurações sejam carregadas sempre, é comum colocar todas as personalizações em .bashrc e fazer com que .bash_profile o inclua. Veja um exemplo de .bash_profile:

# .bash_profile

# Carrega o .bashrc se ele existir
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

Dessa forma, você mantém tudo em um só lugar. Verifique o conteúdo dos seus arquivos atuais com cat ~/.bashrc e cat ~/.bash_profile.

Aliases

Aliases são atalhos para comandos. Eles podem economizar tempo e reduzir erros de digitação. Você pode definir aliases temporários no terminal ou permanentes no .bashrc.

A sintaxe é alias nome='comando'. Veja exemplos comuns:

# Atalhos úteis
alias ll='ls -alF'
alias la='ls -A'
alias ..='cd ..'
alias ...='cd ../..'
alias update='sudo apt update && sudo apt upgrade'

Depois de editar o .bashrc, aplique as mudanças com source ~/.bashrc ou abra um novo terminal. Para listar todos os aliases ativos, use alias sem argumentos. Para remover um alias, use unalias nome.

Lembre-se de que aliases são expandidos apenas se forem o primeiro token do comando. Para substituições mais complexas, considere funções.

Funções no perfil

Funções no Bash são blocos de código que podem ser chamados como comandos. Elas são mais poderosas que aliases, pois aceitam argumentos e podem conter lógica condicional.

Defina funções no .bashrc ou em um arquivo separado que seja carregado. Exemplo de função que cria um diretório e entra nele:

# Função mkcd: cria diretório e entra
mkcd() {
    mkdir -p "$1"
    cd "$1"
}

Para usar, basta digitar mkcd nome_do_diretorio. Outra função útil é um atalho para extrair vários tipos de arquivos:

extract() {
    if [ -f "$1" ]; then
        case "$1" in
            *.tar.bz2)   tar xjf "$1" ;;
            *.tar.gz)    tar xzf "$1" ;;
            *.zip)       unzip "$1" ;;
            *.rar)       unrar x "$1" ;;
            *)           echo "Formato não suportado" ;;
        esac
    else
        echo "Arquivo não encontrado"
    fi
}

Funções podem acessar parâmetros com $1, $2, etc. e retornar valores com return. Elas são essenciais para automatizar tarefas repetitivas.

PROMPT (PS1)

A variável PS1 define a aparência do prompt primário. Personalizá-lo pode mostrar informações como usuário, diretório atual, branch git, etc.

O prompt padrão em muitas distros é algo como \u@\h:\w$, onde \u é o usuário, \h o hostname, \w o diretório de trabalho e $ indica usuário comum (ou # para root). Exemplo:

# Prompt simples com cores
export PS1='\[\e[32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]$ '

Isso mostra o usuário em verde, o diretório em azul e o restante na cor padrão. Você pode incluir outras informações, como o código de saída do último comando:

export PS1='\u@\h:\w [`echo $?`] $ '

Para tornar o prompt mais avançado, muitos usam o git branch quando estão em um repositório. Exemplo com função:

git_branch() {
    branch=$(git branch --show-current 2>/dev/null)
    if [ -n "$branch" ]; then
        echo " ($branch)"
    fi
}
export PS1='\[\e[32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]\[\e[33m\]$(git_branch)\[\e[0m\]$ '

Teste diferentes configurações e escolha a que melhor se adapta ao seu fluxo de trabalho.

Boas práticas e observações finais

Ao configurar seu ambiente, mantenha o .bashrc organizado com comentários e seções. Use um arquivo separado para funções e aliases se ficar muito grande, e carregue-o no .bashrc com source.

Evite colocar comandos que geram saída no .bashrc, pois isso poluirá o terminal. Teste mudanças em um terminal separado antes de aplicar definitivamente. Lembre-se de que o .bashrc é específico do Bash; se você usar outro shell, os arquivos serão diferentes.

Por fim, faça backup dos seus arquivos de configuração antes de grandes mudanças. Você pode versioná-los com Git para acompanhar alterações.

Referências

Exercícios

  1. Explique a diferença entre .bashrc e .bash_profile e em que situações cada um é lido.
  2. Crie um alias chamado glog que exiba o log do Git de forma compacta (uma linha por commit).
  3. Escreva uma função find_large que receba um tamanho mínimo em MB e liste os arquivos maiores que esse tamanho no diretório atual.
  4. Modifique seu PS1 para exibir a hora atual (no formato HH:MM) em amarelo, o usuário em verde e o diretório em azul.
  5. Descreva como você aplicaria as alterações feitas no .bashrc sem reiniciar o terminal e o que acontece se houver um erro de sintaxe.

✓ Resposta: O .bash_profile é lido em shells de login (login via console, SSH), enquanto o .bashrc é lido em shells interativas não-login (como abrir um terminal em ambiente gráfico). O .bash_profile geralmente chama o .bashrc para garantir que as configurações sejam aplicadas em ambos os casos.

✓ Resposta: Adicione ao .bashrc:
alias glog='git log --oneline --graph --all'

✓ Resposta: Função:
find_large() {
    find . -type f -size +${1}M -exec ls -lh {} \;
}

✓ Resposta: Exemplo de PS1:
export PS1='\[\e[33m\]\t\[\e[0m\] \[\e[32m\]\u\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]$ '

✓ Resposta: Para aplicar as alterações sem reiniciar, use source ~/.bashrc ou . ~/.bashrc. Se houver um erro de sintaxe, o Bash exibirá uma mensagem de erro e interromperá o carregamento do arquivo naquele ponto; as configurações anteriores permanecem ativas.