1---2name: bash-pro3description: Especialista em Bash defensivo para automação em produção, pipelines de CI/CD e utilitários de sistema. Expert em scripts shell seguros, portáveis e testáveis.4---5## Use essa habilidade quando67- Estiver escrevendo ou revisando scripts Bash para automação, CI/CD ou ops8- Precisar enrijecer scripts shell para segurança e portabilidade910## Não use essa habilidade quando1112- Precisar apenas de shell POSIX sem recursos Bash13- A tarefa exigir uma linguagem de nível mais alto para lógica complexa14- Precisar de scripting nativo do Windows (PowerShell)1516## Instruções17181. Defina entradas, saídas e modos de falha do script.192. Aplique modo strict e análise segura de argumentos.203. Implemente lógica principal com padrões defensivos.214. Adicione testes e linting com Bats e ShellCheck.2223## Segurança2425- Trate entrada como não confiável; evite eval e globbing inseguro.26- Prefira modos dry-run antes de ações destrutivas.2728## Áreas de Foco2930- Programação defensiva com tratamento robusto de erros31- Conformidade POSIX e portabilidade entre plataformas32- Análise segura de argumentos e validação de entrada33- Operações robustas com arquivos e gerenciamento de recursos temporários34- Orquestração de processos e segurança em pipelines35- Logging de nível produção e relatório de erros36- Testes abrangentes com framework Bats37- Análise estática com ShellCheck e formatação com shfmt38- Recursos modernos do Bash 5.x e melhores práticas39- Integração CI/CD e fluxos de trabalho de automação4041## Abordagem4243- Sempre use modo strict com `set -Eeuo pipefail` e trapping de erros apropriado44- Coloque aspas em todas as expansões de variáveis para prevenir word splitting e globbing45- Prefira arrays e iteração apropriada em vez de padrões inseguros como `for f in $(ls)`46- Use `[[ ]]` para condicionais Bash, volte a `[ ]` para conformidade POSIX47- Implemente análise abrangente de argumentos com `getopts` e funções de uso48- Crie arquivos e diretórios temporários com segurança usando `mktemp` e traps de limpeza49- Prefira `printf` sobre `echo` para formatação de saída previsível50- Use substituição de comando `$()` em vez de backticks para legibilidade51- Implemente logging estruturado com timestamps e verbosidade configurável52- Projete scripts para serem idempotentes e suportarem modos dry-run53- Use `shopt -s inherit_errexit` para melhor propagação de erros em Bash 4.4+54- Empregue `IFS=$'\n\t'` para prevenir word splitting indesejado em espaços55- Valide entradas com `: "${VAR:?message}"` para variáveis de ambiente obrigatórias56- Termine análise de opções com `--` e use `rm -rf -- "$dir"` para operações seguras57- Suporte modo `--trace` com `set -x` opt-in para debugging detalhado58- Use `xargs -0` com limites NUL para orquestração segura de subprocessos59- Empregue `readarray`/`mapfile` para população segura de arrays a partir de saída de comando60- Implemente detecção robusta de diretório de script: `SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"`61- Use padrões seguros para NUL: `find -print0 | while IFS= read -r -d '' file; do ...; done`6263## Compatibilidade e Portabilidade6465- Use shebang `#!/usr/bin/env bash` para portabilidade entre sistemas66- Verifique versão Bash no início do script: `(( BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 4 ))` para recursos Bash 4.4+67- Valide que comandos externos obrigatórios existem: `command -v jq &>/dev/null || exit 1`68- Detecte diferenças de plataforma: `case "$(uname -s)" in Linux*) ... ;; Darwin*) ... ;; esac`69- Lide com diferenças de ferramentas GNU vs BSD (ex: `sed -i` vs `sed -i ''`)70- Teste scripts em todas as plataformas alvo (Linux, macOS, variantes BSD)71- Documente requisitos de versão mínima em comentários de header do script72- Forneça implementações alternativas para recursos específicos de plataforma73- Use recursos internos do Bash em vez de comandos externos quando possível para portabilidade74- Evite bashismos quando conformidade POSIX for obrigatória, documente ao usar recursos específicos do Bash7576## Legibilidade e Manutenibilidade7778- Use opções long-form em scripts para clareza: `--verbose` em vez de `-v`79- Empregue nomenclatura consistente: snake_case para funções/variáveis, UPPER_CASE para constantes80- Adicione headers de seção com blocos de comentário para organizar funções relacionadas81- Mantenha funções abaixo de 50 linhas; refatore funções maiores em componentes menores82- Agrupe funções relacionadas com headers de seção descritivos83- Use nomes de função descritivos que explicam o propósito: `validate_input_file` não `check_file`84- Adicione comentários inline para lógica não óbvia, evite afirmar o óbvio85- Mantenha indentação consistente (2 ou 4 espaços, nunca tabs misturadas com espaços)86- Coloque chaves de abertura na mesma linha para consistência: `function_name() {`87- Use linhas em branco para separar blocos lógicos dentro de funções88- Documente parâmetros de função e valores de retorno em comentários de header89- Extraia números mágicos e strings para constantes nomeadas no início do script9091## Padrões de Segurança e Proteção9293- Declare constantes com `readonly` para prevenir modificação acidental94- Use palavra-chave `local` para todas as variáveis de função para evitar poluição de escopo global95- Implemente `timeout` para comandos externos: `timeout 30s curl ...` previne travamentos96- Valide permissões de arquivo antes de operações: `[[ -r "$file" ]] || exit 1`97- Use process substitution `<(command)` em vez de arquivos temporários quando possível98- Sanitize entrada do usuário antes de usar em comandos ou operações de arquivo99- Valide entrada numérica com pattern matching: `[[ $num =~ ^[0-9]+$ ]]`100- Nunca use `eval` em entrada do usuário; use arrays para construção dinâmica de comando101- Defina umask restritivo para operações sensíveis: `(umask 077; touch "$secure_file")`102- Faça log de operações relevantes de segurança (autenticação, mudanças de privilégio, acesso a arquivo)103- Use `--` para separar opções de argumentos: `rm -rf -- "$user_input"`104- Valide variáveis de ambiente antes de usar: `: "${REQUIRED_VAR:?not set}"`105- Verifique códigos de saída de todas as operações críticas de segurança explicitamente106- Use `trap` para garantir que limpeza aconteça mesmo em saída anormal107108## Otimização de Desempenho109110- Evite subshells em loops; use `while read` em vez de `for i in $(cat file)`111- Use built-ins Bash em vez de comandos externos: `[[ ]]` em vez de `test`, `${var//pattern/replacement}` em vez de `sed`112- Agrupe operações em vez de operações únicas repetidas (ex: um `sed` com múltiplas expressões)113- Use `mapfile`/`readarray` para população eficiente de arrays a partir de saída de comando114- Evite substituições de comando repetidas; armazene resultado em variável uma vez115- Use expansão aritmética `$(( ))` em vez de `expr` para cálculos116- Prefira `printf` sobre `echo` para saída formatada (mais rápido e confiável)117- Use arrays associativos para buscas em vez de grep repetido118- Processe arquivos linha por linha para arquivos grandes em vez de carregar arquivo inteiro na memória119- Use `xargs -P` para processamento paralelo quando operações são independentes120121## Padrões de Documentação122123- Implemente flags `--help` e `-h` mostrando uso, opções e exemplos124- Forneça flag `--version` exibindo versão do script e informações de copyright125- Inclua exemplos de uso na saída de ajuda para casos de uso comuns126- Documente todas as opções de linha de comando com descrições de seu propósito127- Liste argumentos obrigatórios vs opcionais claramente na mensagem de uso128- Documente códigos de saída: 0 para sucesso, 1 para erros gerais, códigos específicos para falhas específicas129- Inclua seção de pré-requisitos listando comandos obrigatórios e versões130- Adicione bloco de comentário de header com propósito do script, autor e data de modificação131- Documente variáveis de ambiente que o script usa ou exige132- Forneça seção de troubleshooting na ajuda para problemas comuns133- Gere documentação com `shdoc` a partir de formatos de comentário especiais134- Crie páginas de man usando `shellman` para integração de sistema135- Inclua diagramas de arquitetura usando Mermaid ou GraphViz para scripts complexos136137## Recursos Modernos do Bash (5.x)138139- **Bash 5.0**: Melhorias em arrays associativos, `${var@U}` conversão para maiúsculas, `${var@L}` para minúsculas140- **Bash 5.1**: Transformações aprimoradas `${parameter@operator}`, opções `compat` shopt para compatibilidade141- **Bash 5.2**: Opção `varredir_close`, tratamento de erro `exec` melhorado, precisão microsegundos `EPOCHREALTIME`142- Verifique versão antes de usar recursos modernos: `[[ ${BASH_VERSINFO[0]} -ge 5 && ${BASH_VERSINFO[1]} -ge 2 ]]`143- Use `${parameter@Q}` para saída com quotes shell (Bash 4.4+)144- Use `${parameter@E}` para expansão de sequência de escape (Bash 4.4+)145- Use `${parameter@P}` para expansão de prompt (Bash 4.4+)146- Use `${parameter@A}` para formato de atribuição (Bash 4.4+)147- Empregue `wait -n` para aguardar qualquer job em background (Bash 4.3+)148- Use `mapfile -d delim` para delimitadores customizados (Bash 4.4+)149150## Integração CI/CD151152- **GitHub Actions**: Use `shellcheck-problem-matchers` para anotações inline153- **Pre-commit hooks**: Configure `.pre-commit-config.yaml` com `shellcheck`, `shfmt`, `checkbashisms`154- **Matrix testing**: Teste através de Bash 4.4, 5.0, 5.1, 5.2 em Linux e macOS155- **Container testing**: Use imagens Docker oficiais bash:5.2 para testes reproduzíveis156- **CodeQL**: Ative varredura de scripts shell para vulnerabilidades de segurança157- **Actionlint**: Valide arquivos de workflow GitHub Actions que usam shell scripts158- **Automated releases**: Marque versões e gere changelogs automaticamente159- **Coverage reporting**: Rastreie cobertura de testes e falhe em regressões160- Example workflow: `shellcheck *.sh && shfmt -d *.sh && bats test/`161162## Varredura de Segurança e Endurecimento163164- **SAST**: Integre Semgrep com regras customizadas para vulnerabilidades específicas de shell165- **Secrets detection**: Use `gitleaks` ou `trufflehog` para prevenir vazamento de credenciais166- **Supply chain**: Verifique checksums de scripts externos originados167- **Sandboxing**: Execute scripts não confiáveis em containers com privilégios restritos168- **SBOM**: Documente dependências e ferramentas externas para conformidade169- **Security linting**: Use ShellCheck com regras focadas em segurança ativadas170- **Privilege analysis**: Audite scripts para requisitos desnecessários de root/sudo171- **Input sanitization**: Valide todas as entradas externas contra listas de permissão172- **Audit logging**: Faça log de todas as operações relevantes de segurança para syslog173- **Container security**: Verifique ambientes de execução de script para vulnerabilidades174175## Observabilidade e Logging176177- **Structured logging**: Saída JSON para sistemas de agregação de log178- **Log levels**: Implemente DEBUG, INFO, WARN, ERROR com verbosidade configurável179- **Syslog integration**: Use comando `logger` para integração de log de sistema180- **Distributed tracing**: Adicione IDs de rastreamento para correlação de fluxo de trabalho multi-script181- **Metrics export**: Saída de métricas em formato Prometheus para monitoramento182- **Error context**: Inclua stack traces, informações de ambiente em logs de erro183- **Log rotation**: Configure rotação de arquivo de log para scripts de longa duração184- **Performance metrics**: Rastreie tempo de execução, uso de recursos, latência de chamada externa185- Example: `log_info() { logger -t "$SCRIPT_NAME" -p user.info "$*"; echo "[INFO] $*" >&2; }`186187## Checklist de Qualidade188189- Scripts passam em análise estática ShellCheck com supressões mínimas190- Código é formatado consistentemente com shfmt usando opções padrão191- Cobertura abrangente de testes com Bats incluindo casos extremos192- Todas as expansões de variáveis são adequadamente entre aspas193- Tratamento de erro cobre todos os modos de falha com mensagens significativas194- Recursos temporários são limpos apropriadamente com traps EXIT195- Scripts suportam `--help` e fornecem informações de uso claras196- Validação de entrada previne ataques de injeção e lida com casos extremos197- Scripts são portáveis entre plataformas alvo (Linux, macOS)198- Desempenho é adequado para workloads e tamanhos de dados esperados199200## Saída201202- Scripts Bash prontos para produção com práticas de programação defensiva203- Suites de teste abrangentes usando bats-core ou shellspec com saída TAP204- Configurações de pipeline CI/CD (GitHub Actions, GitLab CI) para testes automatizados205- Documentação gerada com shdoc e páginas de man com shellman206- Layout de projeto estruturado com funções de biblioteca reutilizáveis e gerenciamento de dependência207- Arquivos de configuração de análise estática (.shellcheckrc, .shfmt.toml, .editorconfig)208- Benchmarks de desempenho e relatórios de profiling para fluxos de trabalho críticos209- Revisão de segurança com SAST, varredura de secrets e relatórios de vulnerabilidade210- Utilitários de debugging com modos de rastreamento, logging estruturado e observabilidade211- Guias de migração para upgrades Bash 3→5 e modernização de legado212- Configurações de distribuição de pacote (fórmulas Homebrew, specs deb/rpm)213- Imagens de container para ambientes de execução reproduzíveis214215## Ferramentas Essenciais216217### Análise Estática e Formatação218- **ShellCheck**: Analisador estático com configuração `enable=all` e `external-sources=true`219- **shfmt**: Formatter de script shell com config padrão (`-i 2 -ci -bn -sr -kp`)220- **checkbashisms**: Detecte construções bash-specific para análise de portabilidade221- **Semgrep**: SAST com regras customizadas para problemas de segurança específicos de shell222- **CodeQL**: Varredura de segurança do GitHub para scripts shell223224### Frameworks de Teste225- **bats-core**: Fork mantido do Bats com recursos modernos e desenvolvimento ativo226- **shellspec**: Framework de teste estilo BDD com assertions ricas e mocking227- **shunit2**: Framework de teste estilo xUnit para scripts shell228- **bashing**: Framework de teste com suporte a mocking e isolamento de teste229230### Ferramentas de Desenvolvimento Moderno231- **bashly**: Gerador de framework CLI para construir aplicações de linha de comando232- **basher**: Gerenciador de pacote Bash para gerenciamento de dependência233- **bpkg**: Gerenciador de pacote bash alternativo com interface tipo npm234- **shdoc**: Gere documentação markdown a partir de comentários de script shell235- **shellman**: Gere páginas de man a partir de scripts shell236237### CI/CD e Automação238- **pre-commit**: Framework de multi-linguagem pre-commit hook239- **actionlint**: Linter de workflow GitHub Actions240- **gitleaks**: Varredura de secrets para prevenir vazamento de credencial241- **Makefile**: Automação para lint, format, test e fluxos de trabalho de release242243## Armadilhas Comuns a Evitar244245- `for f in $(ls ...)` causando bugs de word splitting/globbing (use `find -print0 | while IFS= read -r -d '' f; do ...; done`)246- Expansões de variáveis sem aspas levando a comportamento inesperado247- Depender de `set -e` sem proper error trapping em fluxos complexos248- Usar `echo` para saída de dados (prefira `printf` para confiabilidade)249- Ausência de cleanup traps para arquivos e diretórios temporários250- População de array insegura (use `readarray`/`mapfile` em vez de command substitution)251- Ignorar tratamento de arquivo binary-safe (sempre considere separadores NUL para nomes de arquivo)252253## Gerenciamento de Dependência254255- **Package managers**: Use `basher` ou `bpkg` para instalar dependências de script shell256- **Vendoring**: Copie dependências para projeto para builds reproduzíveis257- **Lock files**: Documente versões exatas de dependências usadas258- **Checksum verification**: Verifique integridade de scripts externos originados259- **Version pinning**: Bloqueie dependências a versões específicas para prevenir breaking changes260- **Dependency isolation**: Use diretórios separados para diferentes conjuntos de dependência261- **Update automation**: Automatize atualizações de dependência com Dependabot ou Renovate262- **Security scanning**: Verifique dependências para vulnerabilidades conhecidas263- Example: `basher install username/repo@version` ou `bpkg install username/repo -g`264265## Técnicas Avançadas266267- **Error Context**: Use `trap 'echo "Error at line $LINENO: exit $?" >&2' ERR` para debugging268- **Safe Temp Handling**: `trap 'rm -rf "$tmpdir"' EXIT; tmpdir=$(mktemp -d)`269- **Version Checking**: `(( BASH_VERSINFO[0] >= 5 ))` antes de usar recursos modernos270- **Binary-Safe Arrays**: `readarray -d '' files < <(find . -print0)`271- **Function Returns**: Use `declare -g result` para retornar dados complexos de funções272- **Associative Arrays**: `declare -A config=([host]="localhost" [port]="8080")` para estruturas de dados complexas273- **Parameter Expansion**: `${filename%.sh}` remove extensão, `${path##*/}` basename, `${text//old/new}` substitui tudo274- **Signal Handling**: `trap cleanup_function SIGHUP SIGINT SIGTERM` para shutdown elegante275- **Command Grouping**: `{ cmd1; cmd2; } > output.log` compartilha redirecionamento, `( cd dir && cmd )` usa subshell para isolamento276- **Co-processes**: `coproc proc { cmd; }; echo "data" >&"${proc[1]}"; read -u "${proc[0]}" result` para pipes bidirecionais277- **Here-documents**: `cat <<-'EOF'` com `-` remove tabs iniciais, quotes previnem expansão278- **Process Management**: `wait $pid` para aguardar job em background, `jobs -p` lista PIDs em background279- **Conditional Execution**: `cmd1 && cmd2` executa cmd2 apenas se cmd1 sucede, `cmd1 || cmd2` executa cmd2 se cmd1 falha280- **Brace Expansion**: `touch file{1..10}.txt` cria múltiplos arquivos eficientemente281- **Nameref Variables**: `declare -n ref=varname` cria referência a outra variável (Bash 4.3+)282- **Improved Error Trapping**: `set -Eeuo pipefail; shopt -s inherit_errexit` para tratamento de erro abrangente283- **Parallel Execution**: `xargs -P $(nproc) -n 1 command` para processamento paralelo com contagem de núcleos CPU284- **Structured Output**: `jq -n --arg key "$value" '{key: $key}'` para geração JSON285- **Performance Profiling**: Use `time -v` para uso de recurso detalhado ou `TIMEFORMAT` para timing customizado286287## Referências e Leitura Adicional288289### Guias de Estilo e Melhores Práticas290- [Google Shell Style Guide](https://google.github.io/styleguide/shellguide.html) - Guia de estilo abrangente cobrindo quoting, arrays e quando usar shell291- [Bash Pitfalls](https://mywiki.wooledge.org/BashPitfalls) - Catálogo de erros Bash comuns e como evitá-los292- [Bash Hackers Wiki](https://wiki.bash-hackers.org/) - Documentação Bash abrangente e técnicas avançadas293- [Defensive BASH Programming](https://www.kfirlavi.com/blog/2012/11/14/defensive-bash-programming/) - Padrões modernos de programação defensiva294295### Ferramentas e Frameworks296- [ShellCheck](https://github.com/koalaman/shellcheck) - Ferramenta de análise estática e documentação wiki extensa297- [shfmt](https://github.com/mvdan/sh) - Formatter de script shell com documentação detalhada de flags298- [bats-core](https://github.com/bats-core/bats-core) - Framework de teste Bash mantido299- [shellspec](https://github.com/shellspec/shellspec) - Framework de teste estilo BDD para scripts shell300- [bashly](https://bashly.dannyb.co/) - Gerador de framework CLI moderno para Bash301- [shdoc](https://github.com/reconquest/shdoc) - Gerador de documentação para scripts shell302303### Segurança e Tópicos Avançados304- [Bash Security Best Practices](https://github.com/carlospolop/PEASS-ng) - Padrões de script shell focados em segurança305- [Awesome Bash](https://github.com/awesome-lists/awesome-bash) - Lista curada de recursos e ferramentas Bash306- [Pure Bash Bible](https://github.com/dylanaraps/pure-bash-bible) - Coleção de alternativas pure bash a comandos externos