Created
June 7, 2026 17:47
-
-
Save vdonoladev/2c506ef583220b9b96b1426d382f26be to your computer and use it in GitHub Desktop.
Minhas configurações personalizadas para o Bash
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # ============================================ | |
| # .bashrc - Configuração do Bash | |
| # ============================================ | |
| # Autor: vdonoladev | |
| # ~/.bashrc: executado pelo bash(1) para shells não-login | |
| # ============================================ | |
| # Se não estiver rodando interativamente, não fazer nada | |
| case $- in | |
| *i*) ;; | |
| *) return;; | |
| esac | |
| # ============================================ | |
| # HISTÓRICO DO BASH | |
| # ============================================ | |
| # Tamanho do histórico na memória (número de comandos) | |
| HISTSIZE=10000 | |
| # Tamanho do arquivo de histórico no disco | |
| HISTFILESIZE=20000 | |
| # Adiciona timestamp aos comandos no histórico (formato: YYYY-MM-DD HH:MM:SS) | |
| HISTTIMEFORMAT="%F %T " | |
| # Controle do histórico: | |
| # - ignoredups: não salva comandos duplicados consecutivos | |
| # - ignorespace: não salva comandos que começam com espaço | |
| # - erasedups: remove duplicatas antigas ao adicionar novo comando | |
| HISTCONTROL=ignoredups:erasedups:ignorespace | |
| # Comandos que NÃO devem ser salvos no histórico | |
| HISTIGNORE="ls:ll:cd:pwd:exit:clear:history" | |
| # Anexa ao histórico ao invés de sobrescrever (importante para múltiplas sessões) | |
| shopt -s histappend | |
| # Salva comandos multi-linha como uma única entrada no histórico | |
| shopt -s cmdhist | |
| # ============================================ | |
| # COMPORTAMENTO DO SHELL | |
| # ============================================ | |
| # Atualiza LINES e COLUMNS após cada comando (útil para redimensionamento de janela) | |
| shopt -s checkwinsize | |
| # Permite usar ** para busca recursiva de arquivos (ex: ls **/*.txt) | |
| shopt -s globstar | |
| # Corrige erros menores de digitação em nomes de diretórios ao usar cd | |
| shopt -s cdspell | |
| # Corrige erros menores em nomes de diretórios durante a conclusão | |
| shopt -s dirspell | |
| # Expande aliases em comandos não-interativos | |
| shopt -s expand_aliases | |
| # ============================================ | |
| # LESSPIPE (Torna o less mais amigável) | |
| # ============================================ | |
| [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" | |
| # ============================================ | |
| # CHROOT (para ambientes enjaulados) | |
| # ============================================ | |
| if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then | |
| debian_chroot=$(cat /etc/debian_chroot) | |
| fi | |
| # ============================================ | |
| # CORES PARA PROMPT E SCRIPTS | |
| # ============================================ | |
| # Habilita suporte a cores no terminal | |
| if [ -x /usr/bin/dircolors ]; then | |
| test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" | |
| fi | |
| # Cores para uso no PROMPT (com escape) | |
| export PROMPT_RED='\[\033[0;31m\]' | |
| export PROMPT_GREEN='\[\033[0;32m\]' | |
| export PROMPT_YELLOW='\[\033[0;33m\]' | |
| export PROMPT_BLUE='\[\033[0;34m\]' | |
| export PROMPT_PURPLE='\[\033[0;35m\]' | |
| export PROMPT_CYAN='\[\033[0;36m\]' | |
| export PROMPT_WHITE='\[\033[0;37m\]' | |
| export PROMPT_BOLD='\[\033[1m\]' | |
| export PROMPT_RESET='\[\033[0m\]' | |
| # Cores para uso em ECHO e SCRIPTS (sem escape) | |
| export RED='\033[0;31m' | |
| export GREEN='\033[0;32m' | |
| export YELLOW='\033[0;33m' | |
| export BLUE='\033[0;34m' | |
| export PURPLE='\033[0;35m' | |
| export CYAN='\033[0;36m' | |
| export WHITE='\033[0;37m' | |
| export BOLD='\033[1m' | |
| export RESET='\033[0m' | |
| # ============================================ | |
| # FUNÇÕES PARA GIT NO PROMPT | |
| # ============================================ | |
| # Função para obter a branch atual do Git | |
| parse_git_branch() { | |
| git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' | |
| } | |
| # Função para obter o status do Git (limpo ou com alterações) | |
| parse_git_dirty() { | |
| [[ $(git status --porcelain 2>/dev/null) ]] && echo "*" | |
| } | |
| # ============================================ | |
| # PROMPT CUSTOMIZADO (PS1) | |
| # ============================================ | |
| # Prompt customizado com cores e informações do Git | |
| # Linha 1: ┌──[usuário@host]─[diretório] (branch_git) | |
| # Linha 2: └─$ | |
| PS1='${debian_chroot:+($debian_chroot)}' | |
| PS1+="${PROMPT_BOLD}${PROMPT_GREEN}┌──[${PROMPT_CYAN}\u${PROMPT_GREEN}@${PROMPT_CYAN}\h${PROMPT_GREEN}]─[${PROMPT_YELLOW}\w${PROMPT_GREEN}]" | |
| PS1+="${PROMPT_YELLOW}\$(parse_git_branch)\$(parse_git_dirty)${PROMPT_RESET}" | |
| PS1+="\n${PROMPT_GREEN}└─${PROMPT_BLUE}\$ ${PROMPT_RESET}" | |
| # Prompt para comandos de continuação (quando comando quebra em múltiplas linhas) | |
| PS2="${PROMPT_BLUE}> ${PROMPT_RESET}" | |
| # Define o título da janela do terminal (user@host:dir) | |
| case "$TERM" in | |
| xterm*|rxvt*) | |
| PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" | |
| ;; | |
| *) | |
| ;; | |
| esac | |
| # ============================================ | |
| # SUPORTE A CORES EM COMANDOS | |
| # ============================================ | |
| # Habilita suporte a cores para ls, grep, etc | |
| if [ -x /usr/bin/dircolors ]; then | |
| test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" | |
| alias ls='ls --color=auto' | |
| alias grep='grep --color=auto' | |
| alias fgrep='fgrep --color=auto' | |
| alias egrep='egrep --color=auto' | |
| fi | |
| # ============================================ | |
| # ALIASES PADRÃO DO SISTEMA | |
| # ============================================ | |
| # Aliases básicos de ls (podem ser sobrescritos no .bash_aliases) | |
| alias ll='ls -alF' # Lista detalhada incluindo arquivos ocultos | |
| alias la='ls -A' # Lista todos exceto . e .. | |
| alias l='ls -CF' # Lista em colunas com indicadores de tipo | |
| # Alias para notificação de comandos longos | |
| # Uso: sleep 10; alert | |
| alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' | |
| # ============================================ | |
| # AUTOCOMPLETE MELHORADO | |
| # ============================================ | |
| # Habilita autocomplete programável se disponível | |
| if ! shopt -oq posix; then | |
| if [ -f /usr/share/bash-completion/bash_completion ]; then | |
| . /usr/share/bash-completion/bash_completion | |
| elif [ -f /etc/bash_completion ]; then | |
| . /etc/bash_completion | |
| fi | |
| fi | |
| # Autocomplete ignora maiúsculas/minúsculas | |
| bind "set completion-ignore-case on" 2>/dev/null | |
| # Mostra opções de autocomplete imediatamente | |
| bind "set show-all-if-ambiguous on" 2>/dev/null | |
| # Completa automaticamente após um TAB ao invés de mostrar opções | |
| bind "set menu-complete-display-prefix on" 2>/dev/null | |
| # Adiciona "/" automaticamente ao completar diretórios | |
| bind "set mark-directories on" 2>/dev/null | |
| bind "set mark-symlinked-directories on" 2>/dev/null | |
| # Completa nomes de hosts ao usar @ | |
| bind "set mark-modified-lines on" 2>/dev/null | |
| # Mostra estatísticas de arquivos ao completar | |
| bind "set visible-stats on" 2>/dev/null | |
| # Usa cores no autocomplete | |
| bind "set colored-stats on" 2>/dev/null | |
| # ============================================ | |
| # VARIÁVEIS DE AMBIENTE | |
| # ============================================ | |
| # Define o editor padrão (usado por Git, cron, etc) | |
| export EDITOR='code --wait' | |
| export VISUAL='code --wait' | |
| # Define o pager padrão (usado por man, less, etc) | |
| export PAGER='less' | |
| # Opções do less: | |
| # -R: interpreta cores ANSI | |
| # -X: não limpa a tela ao sair | |
| # -F: sai automaticamente se conteúdo couber na tela | |
| export LESS='-R -X -F' | |
| # ============================================ | |
| # LOCALE - IDIOMA DO SISTEMA | |
| # ============================================ | |
| # Usa pt_BR.UTF-8 apenas se o locale estiver instalado no sistema. | |
| # Caso contrário, usa en_US.UTF-8 para evitar erros de "cannot change locale". | |
| # Para instalar o locale pt_BR: sudo locale-gen pt_BR.UTF-8 && sudo update-locale | |
| if locale -a 2>/dev/null | grep -qi "pt_BR.UTF-8\|pt_BR.utf8"; then | |
| export LANG=en_US.UTF-8 | |
| export LC_ALL=en_US.UTF-8 | |
| else | |
| export LANG=en_US.UTF-8 | |
| export LC_ALL=en_US.UTF-8 | |
| fi | |
| # ============================================ | |
| # PATH - CAMINHOS PERSONALIZADOS | |
| # ============================================ | |
| # Adiciona ~/.local/bin ao PATH se existir (seus scripts pessoais) | |
| [ -d "$HOME/.local/bin" ] && export PATH="$HOME/.local/bin:$PATH" | |
| # Adiciona ~/bin ao PATH se existir | |
| [ -d "$HOME/bin" ] && export PATH="$HOME/bin:$PATH" | |
| # Adiciona composer bin ao PATH (PHP) | |
| export PATH="$HOME/.config/composer/vendor/bin:$PATH" | |
| # Adiciona Herd Lite ao PATH (PHP) | |
| export PATH="/home/vdonoladev/.config/herd-lite/bin:$PATH" | |
| export PHP_INI_SCAN_DIR="/home/vdonoladev/.config/herd-lite/bin:$PHP_INI_SCAN_DIR" | |
| # ============================================ | |
| # FUNÇÕES ÚTEIS PERSONALIZADAS | |
| # ============================================ | |
| # Cria um diretório e entra nele automaticamente | |
| # Uso: mkcd nome_do_diretorio | |
| mkcd() { | |
| mkdir -p "$1" && cd "$1" | |
| } | |
| # Extrai qualquer tipo de arquivo compactado | |
| # Uso: extract arquivo.zip | |
| extract() { | |
| if [ -f "$1" ]; then | |
| case "$1" in | |
| *.tar.bz2) tar xjf "$1" ;; | |
| *.tar.gz) tar xzf "$1" ;; | |
| *.bz2) bunzip2 "$1" ;; | |
| *.rar) unrar x "$1" ;; | |
| *.gz) gunzip "$1" ;; | |
| *.tar) tar xf "$1" ;; | |
| *.tbz2) tar xjf "$1" ;; | |
| *.tgz) tar xzf "$1" ;; | |
| *.zip) unzip "$1" ;; | |
| *.Z) uncompress "$1" ;; | |
| *.7z) 7z x "$1" ;; | |
| *.deb) ar x "$1" ;; | |
| *.tar.xz) tar xf "$1" ;; | |
| *.tar.zst) unzstd "$1" ;; | |
| *) echo "'$1' não pode ser extraído via extract()" ;; | |
| esac | |
| else | |
| echo "'$1' não é um arquivo válido" | |
| fi | |
| } | |
| # Busca texto em arquivos recursivamente | |
| # Uso: search "texto" | |
| search() { | |
| grep -rnw . -e "$1" --color=auto | |
| } | |
| # Mostra os 10 comandos mais usados | |
| # Uso: topcommands | |
| topcommands() { | |
| history | awk '{CMD[$4]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10 | |
| } | |
| # Cria backup de um arquivo adicionando timestamp | |
| # Uso: backup arquivo.txt (cria arquivo.txt.2024-11-25.bak) | |
| backup() { | |
| if [ -f "$1" ]; then | |
| cp "$1" "$1.$(date +%Y-%m-%d).bak" | |
| echo "Backup criado: $1.$(date +%Y-%m-%d).bak" | |
| else | |
| echo "Arquivo '$1' não encontrado" | |
| fi | |
| } | |
| # Mostra o tamanho dos diretórios no diretório atual | |
| # Uso: dirsize | |
| dirsize() { | |
| du -sh */ 2>/dev/null | sort -hr | |
| } | |
| # Cria um servidor HTTP simples na porta especificada (padrão: 8000) | |
| # Uso: serve [porta] | |
| serve() { | |
| local port="${1:-8000}" | |
| echo "Servidor rodando em http://localhost:$port" | |
| python3 -m http.server "$port" | |
| } | |
| # Mostra uso de memória dos 10 processos que mais consomem | |
| # Uso: memtop | |
| memtop() { | |
| echo -e "${BOLD}${CYAN}=== TOP 10 PROCESSOS POR USO DE MEMÓRIA ===${RESET}\n" | |
| ps aux --sort=-%mem | awk 'NR==1{printf "%-10s %5s %5s %10s %s\n", $1, $3, $4, $6, $11} NR>1 && NR<=11{printf "%-10s %5s%% %5s%% %10s %s\n", $1, $3, $4, $6, $11}' | |
| } | |
| # Mostra uso de CPU dos 10 processos que mais consomem | |
| # Uso: cputop | |
| cputop() { | |
| echo -e "${BOLD}${CYAN}=== TOP 10 PROCESSOS POR USO DE CPU ===${RESET}\n" | |
| ps aux --sort=-%cpu | awk 'NR==1{printf "%-10s %5s %5s %10s %s\n", $1, $3, $4, $6, $11} NR>1 && NR<=11{printf "%-10s %5s%% %5s%% %10s %s\n", $1, $3, $4, $6, $11}' | |
| } | |
| # Mostra informações do sistema de forma resumida | |
| # Uso: sysinfo | |
| sysinfo() { | |
| echo -e "${BOLD}${CYAN}=== INFORMAÇÕES DO SISTEMA ===${RESET}" | |
| echo -e "${GREEN}Sistema Operacional:${RESET} $(lsb_release -d | cut -f2)" | |
| echo -e "${GREEN}Kernel:${RESET} $(uname -r)" | |
| echo -e "${GREEN}Hostname:${RESET} $(hostname)" | |
| echo -e "${GREEN}Uptime:${RESET} $(uptime -p)" | |
| echo -e "${GREEN}Uso de Memória:${RESET}" | |
| free -h | grep Mem | awk '{print " Total: "$2" | Usado: "$3" | Livre: "$4}' | |
| echo -e "${GREEN}Uso de Disco:${RESET}" | |
| df -h / | tail -1 | awk '{print " Total: "$2" | Usado: "$3" | Livre: "$4" | Uso: "$5}' | |
| } | |
| # Encontra arquivos grandes no diretório atual | |
| # Uso: bigfiles [tamanho_em_MB] (padrão: 100MB) | |
| bigfiles() { | |
| local size="${1:-100}" | |
| find . -type f -size +"${size}M" -exec ls -lh {} \; 2>/dev/null | awk '{ print $9 ": " $5 }' | |
| } | |
| # Mostra portas abertas e processos associados | |
| # Uso: ports | |
| ports() { | |
| sudo netstat -tulpn | grep LISTEN | |
| } | |
| # ============================================ | |
| # NVM (Node Version Manager) | |
| # ============================================ | |
| export NVM_DIR="$HOME/.nvm" | |
| [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # Carrega o NVM | |
| [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # Carrega autocomplete do NVM | |
| # ============================================ | |
| # HOMEBREW (Linuxbrew) | |
| # ============================================ | |
| # Configura o ambiente do Homebrew (carrega apenas uma vez) | |
| if [ -f /home/linuxbrew/.linuxbrew/bin/brew ]; then | |
| eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" | |
| fi | |
| # ============================================ | |
| # PYTHON VIRTUAL ENVIRONMENT | |
| # ============================================ | |
| export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 | |
| [ -f /usr/local/bin/virtualenvwrapper.sh ] && source /usr/local/bin/virtualenvwrapper.sh | |
| # ============================================ | |
| # RUST (Cargo) | |
| # ============================================ | |
| [ -f "$HOME/.cargo/env" ] && source "$HOME/.cargo/env" | |
| # ============================================ | |
| # ANGULAR CLI | |
| # ============================================ | |
| # Carrega autocomplete do Angular CLI (se instalado) | |
| if command -v ng &> /dev/null; then | |
| source <(ng completion script) | |
| fi | |
| # ============================================ | |
| # CARREGA ALIASES PERSONALIZADOS | |
| # ============================================ | |
| # Carrega o arquivo .bash_aliases se existir | |
| # IMPORTANTE: Seus aliases ficam separados em .bash_aliases | |
| if [ -f ~/.bash_aliases ]; then | |
| . ~/.bash_aliases | |
| fi | |
| # ============================================ | |
| # MENSAGEM DE BOAS-VINDAS | |
| # ============================================ | |
| # Nomes dos dias e meses em português (independente do locale do sistema) | |
| _dia_semana() { | |
| local dias=("Domingo" "Segunda-feira" "Terça-feira" "Quarta-feira" "Quinta-feira" "Sexta-feira" "Sábado") | |
| echo "${dias[$(date +%w)]}" | |
| } | |
| _mes() { | |
| local meses=("" "janeiro" "fevereiro" "março" "abril" "maio" "junho" "julho" "agosto" "setembro" "outubro" "novembro" "dezembro") | |
| echo "${meses[$(date +%-m)]}" | |
| } | |
| echo -e "${BOLD}${GREEN}Bem-vindo, $(whoami)!${RESET}" | |
| echo -e "Hoje é $(_dia_semana), $(date +%d) de $(_mes) de $(date +%Y) - $(date +%H:%M:%S)" | |
| echo "" | |
| # Ou use neofetch se estiver instalado (descomente se preferir) | |
| # if command -v neofetch &> /dev/null; then | |
| # neofetch | |
| # fi | |
| # ============================================ | |
| # CONFIGURAÇÕES LOCAIS ESPECÍFICAS | |
| # ============================================ | |
| # Carrega configurações locais se existirem | |
| # Use este arquivo para configs específicas desta máquina | |
| if [ -f ~/.bashrc.local ]; then | |
| . ~/.bashrc.local | |
| fi | |
| # ============================================ | |
| # FIM DA CONFIGURAÇÃO | |
| # ============================================ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment