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
- Bash Reference Manual - GNU — Documentação oficial do Bash com detalhes sobre arquivos de inicialização e variáveis de ambiente
- Zsh Manual - Sourceforge — Documentação oficial do Zsh sobre arquivos de configuração e inicialização
- Arch Linux Wiki - Bashrc — Guia completo sobre configuração e otimização do .bashrc no Arch Linux
- Oh My Zsh - GitHub — Framework popular para gerenciamento de configuração do Zsh com centenas de plugins e temas
- Efficient Bash Scripting - Linux Journal — Artigo técnico sobre boas práticas de scripting e otimização de shell