Como otimizar seu .bashrc ou .zshrc

1. Entendendo o arquivo de configuração do shell

O arquivo .bashrc (Bash) e .zshrc (Zsh) são scripts executados toda vez que você inicia uma nova sessão interativa do shell. Eles contêm configurações pessoais, aliases, funções e variáveis de ambiente que personalizam sua experiência no terminal.

Quando são carregados:
- .bashrc: Carregado em shells interativos não-login (terminais comuns)
- .zshrc: Carregado em shells interativos do Zsh
- .bash_profile / .zprofile: Carregados em shells de login (SSH, login gráfico)

Boas práticas de organização:
- Separe o arquivo em seções com comentários claros
- Agrupe configurações relacionadas (aliases, funções, variáveis)
- Evite duplicação entre .bashrc e .zshrc usando um arquivo comum

Exemplo de estrutura organizada:

# ============================
# VARIÁVEIS DE AMBIENTE
# ============================
export EDITOR=nvim
export LANG=pt_BR.UTF-8

# ============================
# ALIASES
# ============================
alias ll='ls -lah'
alias gs='git status'

# ============================
# FUNÇÕES
# ============================
mkcd() {
    mkdir -p "$1" && cd "$1"
}

2. Configuração de variáveis de ambiente essenciais

Variáveis de ambiente controlam o comportamento de programas e do próprio shell. As mais importantes incluem:

# Editor padrão
export EDITOR="nvim"
export VISUAL="nvim"

# Localização
export LANG="pt_BR.UTF-8"
export LC_ALL="pt_BR.UTF-8"

# PATH personalizado
export PATH="$HOME/.local/bin:$PATH"
export PATH="$HOME/go/bin:$PATH"

# Gerenciamento de projetos
export PROJECTS_DIR="$HOME/projetos"

Evite poluição: Não exporte variáveis que só são usadas em um contexto específico. Use variáveis locais em funções ou scripts.

Variáveis por projeto: Crie funções que definem variáveis ao entrar em diretórios específicos:

cdproject() {
    cd "$PROJECTS_DIR/$1"
    export NODE_ENV="development"
    export DATABASE_URL="postgres://localhost/meuprojeto"
}

3. Aliases inteligentes para agilizar o dia a dia

Aliases são atalhos que economizam tempo e reduzem erros de digitação.

Navegação rápida:

alias ..='cd ..'
alias ...='cd ../..'
alias ~='cd ~'
alias -='cd -'
alias ll='ls -lah --color=auto'
alias la='ls -A'
alias l='ls -CF'

Git e ferramentas de desenvolvimento:

alias gs='git status'
alias ga='git add'
alias gc='git commit'
alias gp='git push'
alias gl='git log --oneline --graph --all'
alias gd='git diff'

# Docker
alias dps='docker ps'
alias dcu='docker-compose up'
alias dcd='docker-compose down'

Aliases condicionais:

# Apenas se o comando existir
if command -v bat &> /dev/null; then
    alias cat='bat'
fi

if command -v exa &> /dev/null; then
    alias ls='exa --icons'
fi

# Condicional por sistema operacional
if [[ "$OSTYPE" == "darwin"* ]]; then
    alias brew-up='brew update && brew upgrade'
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
    alias apt-up='sudo apt update && sudo apt upgrade'
fi

4. Funções personalizadas para tarefas complexas

Funções permitem criar comandos personalizados com lógica condicional e argumentos.

Criando diretório e entrando:

mkcd() {
    if [ -z "$1" ]; then
        echo "Uso: mkcd <diretorio>"
        return 1
    fi
    mkdir -p "$1" && cd "$1"
}

Deploy rápido para servidor:

deploy() {
    local branch="${1:-main}"
    local server="user@meuservidor.com"

    echo "Fazendo deploy da branch $branch..."
    git checkout "$branch" && git pull origin "$branch"
    rsync -avz --exclude 'node_modules' --exclude '.git' ./ "$server:/var/www/app/"
    ssh "$server" "cd /var/www/app && npm install && pm2 restart app"
}

Backup de configurações:

backup-dotfiles() {
    local backup_dir="$HOME/dotfiles-backup-$(date +%Y%m%d)"
    mkdir -p "$backup_dir"
    cp "$HOME/.bashrc" "$backup_dir/"
    cp "$HOME/.zshrc" "$backup_dir/"
    cp "$HOME/.gitconfig" "$backup_dir/"
    echo "Backup concluído em $backup_dir"
}

Reutilização entre shells: Crie um arquivo compartilhado e carregue-o em ambos:

# No .bashrc
source "$HOME/.shell_common"

# No .zshrc
source "$HOME/.shell_common"

5. Otimização de prompt e plugins

O prompt (PS1) pode exibir informações úteis sem poluir a tela.

Prompt personalizado para Bash:

# Prompt com git branch, hora e status
parse_git_branch() {
    git branch 2>/dev/null | grep '^*' | colrm 1 2
}

PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(parse_git_branch)\[\033[01;31m\]$( [ $? -ne 0 ] && echo " ✗")\[\033[00m\]\$ '

Plugins essenciais para Zsh:

# No .zshrc
plugins=(
    git
    zsh-autosuggestions
    zsh-syntax-highlighting
    history-substring-search
    colored-man-pages
)

Evitando lentidão: Carregue plugins sob demanda:

# Carregar apenas quando o comando for usado
if command -v node &> /dev/null; then
    source "$ZSH/plugins/nvm/nvm.plugin.zsh"
fi

6. Gerenciamento de histórico e navegação

Um histórico bem configurado acelera muito o trabalho no terminal.

Configuração de histórico para Bash:

export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTCONTROL=ignoredups:erasedups
export HISTTIMEFORMAT="%F %T "
shopt -s histappend

Configuração de histórico para Zsh:

export HISTFILE="$HOME/.zsh_history"
export HISTSIZE=10000
export SAVEHIST=10000
setopt SHARE_HISTORY
setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_IGNORE_DUPS
setopt HIST_FIND_NO_DUPS

Atalhos úteis:
- Ctrl+R: Busca reversa no histórico
- fc: Lista e edita comandos do histórico
- !!: Repete o último comando
- !$: Último argumento do comando anterior

Completions automáticos:

# Bash
if [ -f /usr/share/bash-completion/bash_completion ]; then
    source /usr/share/bash-completion/bash_completion
fi

# Zsh (já incluído no Oh My Zsh)
autoload -U compinit && compinit

7. Performance e boas práticas de carregamento

Um .bashrc ou .zshrc lento pode atrasar a abertura de cada terminal.

Evite comandos lentos no carregamento:

# RUIM: Executa toda vez que abre o terminal
source ~/meu-script-lento.sh

# BOM: Carrega apenas quando necessário
if [ -f ~/meu-script-lento.sh ]; then
    alias meu-comando='source ~/meu-script-lento.sh && meu-comando'
fi

Carregamento condicional de ferramentas:

# Apenas carrega se o comando existir
if command -v pyenv &> /dev/null; then
    eval "$(pyenv init -)"
fi

if command -v nvm &> /dev/null; then
    export NVM_DIR="$HOME/.nvm"
    [ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
fi

Otimização para Zsh com zcompile:

# Compilar arquivos para carregamento mais rápido
zcompile ~/.zshrc
zcompile ~/.zsh/plugins/*.zsh

Cache de comandos:

# Cache de comandos para evitar chamadas repetidas
__git_branch() {
    if [ -d .git ]; then
        git branch --show-current 2>/dev/null || echo "no-branch"
    fi
}

Medição de tempo de carregamento:

# Adicione no final do arquivo para ver quanto tempo demorou
echo "Shell carregado em $((SECONDS - START_TIME)) segundos"

Com essas otimizações, seu terminal ficará mais rápido, organizado e produtivo. Lembre-se de testar cada alteração em uma sessão separada antes de aplicar permanentemente.

Referências