Jamie-BitFlight/bash-51-features

Recursos e melhorias da versão Bash 5.1 com exemplos práticos. Use ao trabalhar com funcionalidades do Bash 5.1, variáveis de tempo epoch, melhorias em redirecionamento, ou quando o usuário perguntar sobre mudanças, novos recursos ou capacidades específicas da versão Bash 5.1.

O que é bash-51-features?

Este skill fornece um guia completo sobre os novos recursos e melhorias introduzidos no Bash 5.1, lançado em dezembro de 2020. Ele é especialmente útil para desenvolvedores e administradores de sistemas que desejam modernizar seus scripts shell ou precisam de funcionalidades avançadas como variáveis de timestamp de alta precisão (EPOCHSECONDS e EPOCHREALTIME), números aleatórios criptograficamente fortes (SRANDOM), redirecionamento de descritor de arquivo com nomes de variáveis, e manipulação aprimorada de arrays associativos. O skill também cobre integração com Readline 8.1, melhorias no tratamento de sinais, correções de bugs em pattern matching e desempenho otimizado. Suportado por qualquer ambiente que execute Bash 5.1, ele inclui exemplos práticos prontos para uso, bem como notas de compatibilidade para quem precisa manter scripts funcionando em versões anteriores. Com este guia, o usuário pode adotar rapidamente as novas capacidades, evitando armadilhas comuns e garantindo que o código seja eficiente e seguro.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Jamie-BitFlight/claude_skills/tree/main/plugins/bash-development/skills/bash-51-features

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Recursos e Melhorias do Bash 5.1

Lançado em dezembro de 2020, o Bash 5.1 introduziu vários recursos e melhorias notáveis para scripts shell modernos.

Novas Variáveis de Shell

EPOCHSECONDS e EPOCHREALTIME

Duas novas variáveis especiais para acessar a hora atual:

# Obtém o timestamp Unix atual em segundos
echo "Timestamp atual: ${EPOCHSECONDS}"

# Obtém o timestamp Unix atual com precisão de microssegundos
echo "Timestamp de alta precisão: ${EPOCHREALTIME}"

# Exemplo prático: Benchmarking simples
inicio="${EPOCHREALTIME}"
# ... alguma operação ...
sleep 0.5
fim="${EPOCHREALTIME}"
duracao=$(awk "BEGIN {print ${fim} - ${inicio}}")
echo "Operação levou ${duracao} segundos"

# Exemplo: Log com timestamps precisos
log_message() {
    printf '[%s.%06d] %s\n' \
        "$(date -d "@${EPOCHSECONDS}" '+%Y-%m-%d %H:%M:%S')" \
        "${EPOCHREALTIME#*.}" \
        "$*"
}

log_message "Iniciando processo"

Casos de uso:

  • Medição precisa de desempenho
  • Timestamps de alta resolução para logs
  • Evitar chamadas externas ao comando date
  • Temporização com precisão de microssegundos em scripts

Variável SRANDOM

Números aleatórios criptograficamente fortes:

# Gera um número aleatório seguro (se disponível)
if [[ -n "${SRANDOM}" ]]; then
    aleatorio_seguro="${SRANDOM}"
    echo "Aleatório seguro: ${aleatorio_seguro}"
else
    echo "SRANDOM não disponível (requer getrandom/getentropy)"
fi

# Exemplo prático: Gerar arquivo temporário com nome seguro aleatório
arquivo_temp="/tmp/seguro_${SRANDOM}_${EPOCHSECONDS}.tmp"

Nota: SRANDOM requer suporte do sistema para as chamadas de sistema getrandom() ou getentropy().

Sintaxe de Redirecionamento Aprimorada

Redirecionamento {varname}

Atribui descritor de arquivo a uma variável para melhor gerenciamento de handles de arquivo:

# Abre descritor de arquivo e armazena em variável
exec {fd}< input.txt
enquanto IFS= read -r -u "${fd}" linha; faça
    echo "Lido: ${linha}"
feito
exec {fd}<&-  # Fecha o descritor de arquivo

# Exemplo prático: Múltiplos handles de arquivo
exec {input_fd}< data.txt
exec {output_fd}> resultados.txt
exec {error_fd}> erros.txt

process_data() {
    enquanto IFS= read -r -u "${input_fd}" linha; faça
        if validate_line "${linha}"; then
            echo "Processado: ${linha}" >&"${output_fd}"
        else
            echo "Erro: ${linha}" >&"${error_fd}"
        fi
    feito
}

process_data
exec {input_fd}<&-
exec {output_fd}>&-
exec {error_fd}>&-

Benefícios:

  • Descritores de arquivo nomeados em vez de números mágicos
  • Alocação automática de FD evita conflitos
  • Código mais legível e fácil de manter
  • Rastreamento mais fácil de handles de arquivo abertos

Aprimoramentos em Arrays

Melhor Manipulação de Arrays Associativos

Melhor suporte para operações complexas com arrays:

# Declara array associativo com typeset
declare -A config=(
    [host]="localhost"
    [port]="8080"
    [debug]="true"
)

# Expansão de arrays aprimorada
para key em "${!config[@]}"; faça
    printf '%s=%s\n' "${key}" "${config[${key}]}"
feito

# Exemplo prático: Parser de configuração
parse_config() {
    declare -gA app_config
    local linha key valor

    enquanto IFS='=' read -r key valor; faça
        [[ "${key}" =~ ^[[:space:]]*# ]] && continue  # Pula comentários
        [[ -z "${key}" ]] && continue                  # Pula linhas vazias

        # Remove espaços em branco
        key="${key#"${key%%[![:space:]]*}"}"
        key="${key%"${key##*[![:space:]]}"}"
        valor="${valor#"${valor%%[![:space:]]*}"}"
        valor="${valor%"${valor##*[![:space:]]}"}"

        app_config["${key}"]="${valor}"
    done < config.ini
}

Suporte a Arrays Multidimensionais

Manipulação aprimorada de estruturas de array aninhadas.

Exemplos de código

Integração com Readline 8.1

Interação aprimorada de edição de texto e linha de comando:

Atalhos de Teclado e Histórico

# Configura readline em ~/.inputrc
# Habilita autocompletar sem diferenciação de maiúsculas/minúsculas
set completion-ignore-case on

# Habilita estatísticas visíveis para autocompletação
set visible-stats on

# Mostra todas as opções de autocompletação imediatamente
set show-all-if-ambiguous on

# Usa cores para correspondência de autocompletação
set colored-completion-prefix on

Busca de Histórico Aprimorada

# No seu script ou .bashrc
# Liga Ctrl+R para busca incremental reversa (padrão, mas aprimorada no 5.1)
bind '"\C-r": reverse-search-history'

# Liga Ctrl+S para busca incremental progressiva
bind '"\C-s": forward-search-history'

# Manipulação de histórico melhorada
shopt -s histappend           # Anexa ao histórico
shopt -s cmdhist              # Comandos multi-linha como uma entrada
HISTCONTROL=ignoreboth        # Ignora duplicatas e espaços iniciais
HISTSIZE=10000
HISTFILESIZE=20000

Melhorias em Tratamento de Sinais

Melhor propagação de sinais em subshells e substituições de processo:

# Tratamento de traps aprimorado em subshells
cleanup() {
    echo "Limpando..." >&2
    rm -f "${temp_file}"
    exit 130  # 128 + SIGINT
}

trap cleanup SIGINT SIGTERM

arquivo_temp=$(mktemp)

# Sinal se propaga corretamente por pipes
tarefa_longas | processar_saida &
pid=$!

# Aguarda job em background com tratamento adequado de sinal
wait "${pid}" 2>/dev/null
codigo_saida=$?

if [[ ${codigo_saida} -gt 128 ]]; then
    sinal=$((codigo_saida - 128))
    echo "Processo terminado pelo sinal ${sinal}" >&2
fi

Correções de Bugs e Casos Limítrofes

Manipulação de Subshell

Comportamento melhorado ao criar subshells:

# Herança de variável de subshell mais confiável
var_externa="pai"

(
    # Subshell agora herda variáveis do pai de forma mais confiável
    echo "No subshell: ${var_externa}"
    var_interna="filho"
)

# var_externa ainda acessível, var_interna não
echo "Após subshell: ${var_externa}"

Casos Limítrofes em Correspondência de Padrões

Casos limítrofes corrigidos na correspondência de padrões glob:

# Correspondência glob mais confiável com caracteres especiais
shopt -s nullglob  # Expansão vazia para globs sem correspondência
shopt -s extglob   # Correspondência de padrão estendida

# Exemplo: Corresponder arquivos mas tratar correspondências vazias graciosamente
arquivos=(*.txt)
if [[ ${#arquivos[@]} -eq 0 ]]; then
    echo "Nenhum arquivo .txt encontrado"
else
    printf 'Encontrado: %s\n' "${arquivos[@]}"
fi

Melhorias de Desempenho

  • Expansão de variáveis mais rápida em loops
  • Operações de array otimizadas
  • Uso reduzido de memória para arrays grandes
  • Eficiência melhorada na correspondência de padrões

Notas de Compatibilidade

Atualização do Bash 5.0

A maioria dos scripts é compatível, mas observe:

  • EPOCHSECONDS e EPOCHREALTIME são novos - verifique a existência se visar versões mais antigas
  • SRANDOM pode não estar disponível em todos os sistemas
  • Alguns casos limítrofes obscuros no comportamento de expansão foram corrigidos

Verificação de Versão

# Verifica a versão do Bash antes de usar recursos 5.1
if [[ "${BASH_VERSINFO[0]}" -ge 5 ]] && [[ "${BASH_VERSINFO[1]}" -ge 1 ]]; then
    # Seguro usar recursos do Bash 5.1
    timestamp="${EPOCHSECONDS}"
else
    # Fallback para versões mais antigas
    timestamp=$(date +%s)
fi

Referências

Recursos Adicionais

Para padrões e práticas recomendadas mais amplas de desenvolvimento Bash, consulte:

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

Jamie-BitFlight/agentskill-kaizen-meta-docs

Agentskill kaizen plugin documentation index. Load when needing to read about cross-platform notes, improvement plans, or DuckDB integration.

Jamie-BitFlight/bash-52-features

Bash 5.2 release features and improvements with practical examples. Use when working with Bash 5.2 features, variable handling enhancements, readline improvements, or when user asks about Bash 5.2 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-53-features

Bash 5.3 release features and improvements with practical examples. Use when working with Bash 5.3 features, new command substitution, GLOBSORT, loadable builtins, or when user asks about Bash 5.3 changes, new features, or version-specific capabilities.

Jamie-BitFlight/bash-development

This skill should be used when the user asks to "write a bash script", "create a shell script", "implement bash function", "parse arguments in bash", "handle errors in bash", or mentions bash development, shell scripting, script templates, or modern bash patterns.

Jamie-BitFlight/bash-lint

This skill should be used when the user asks to "lint bash script", "run shellcheck", "format shell script", "use shfmt", "fix shellcheck errors", or mentions shell script linting, formatting, code quality, or pre-commit hooks for bash.

Jamie-BitFlight/bash-logging

This skill should be used when the user asks to "add logging to bash script", "colorize output", "implement log levels", "CI/CD sections", "terminal colors in bash", or mentions logging functions, emoji output, collapsible CI sections, or shlocksmith.

Jamie-BitFlight/bash-portability

This skill should be used when the user asks about "POSIX compatibility", "portable shell scripts", "cross-shell compatibility", "bashisms", "shebang selection", or mentions writing scripts that work on different shells (bash, sh, dash, zsh) or different systems.

Jamie-BitFlight/bash-testing

This skill should be used when the user asks to "test bash script", "write shell tests", "use shunit2", "use shellspec", "create test suite for bash", or mentions unit testing, test frameworks, mocking, or test-driven development for shell scripts.

Jamie-BitFlight/brainstorming-skill

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or when users request help with ideation, marketing, and strategic planning. Explores user intent, requirements, and design before implementation using research-validated prompt patterns.

Jamie-BitFlight/clang-format

Configure clang-format code formatting. Use when: user mentions clang-format or .clang-format, analyzing code style/patterns, creating/modifying formatting config, troubleshooting formatting, brace styles/indentation/spacing/alignment/pointer alignment, or codifying conventions.

Jamie-BitFlight/commitlint

When setting up commit message validation for a project. When project has commitlint.config.js or .commitlintrc files. When configuring CI/CD to enforce commit format. When extracting commit rules for LLM prompt generation. When debugging commit message rejection errors.

Jamie-BitFlight/conventional-commits

When writing a git commit message. When task completes and changes need committing. When project uses semantic-release, commitizen, git-cliff. When choosing between feat/fix/chore/docs types. When indicating breaking changes. When generating changelogs from commit history.

Jamie-BitFlight/dasel-reference

Use when querying, modifying, or converting JSON, YAML, TOML, XML, CSV, HCL, or INI with dasel v3. Complete reference for selectors, functions, conditionals, variables, spread operator, type casting, and format-specific patterns.

Jamie-BitFlight/data-exploration

Use when exploring unknown structured data files with dasel v3 — discover schema, list keys, find nested values, sample arrays, identify data types across JSON, YAML, TOML, XML, CSV, HCL, INI formats

Jamie-BitFlight/data-transformation

Use when modifying, converting, or transforming structured data with dasel v3 — in-place mutations, format conversion, batch operations, array manipulation, object construction, and merge patterns across JSON, YAML, TOML, XML, CSV, HCL, INI

Jamie-BitFlight/delegate

Decompose substantive work into phases, dispatch each phase to a sub-agent, and adjudicate what comes back. Use whenever a request asks for implementation, investigation, a fix, a review, or any change to files — including small ones — and whenever you are about to read source or run a diagnostic yourself instead of handing it off. Also use when a report from a sub-agent needs judging, when a phase needs re-dispatching, or when a user names one instance of a pattern. Does not apply when your own prompt begins "Your ROLE_TYPE is sub-agent." — then follow references/sub-agent-contract.md instead.

Jamie-BitFlight/enterprise-hibernate-hbm

Dasel v3 query patterns for Hibernate .hbm.xml mapping files — entity-table binding, Java property-to-column extraction, one-to-many set/list/bag relationship tracing, many-to-one foreign key discovery, batch scanning across 60+ HBM files. Use when querying Hibernate ORM class mappings, extracting schema metadata from Java persistence layer, or auditing entity-column relationships in enterprise legacy codebases.

Jamie-BitFlight/enterprise-installanywhere

Dasel v3 query patterns for InstallAnywhere .iap_xml installer definitions — use when querying action sequences, discovering variables, resolving platform conditions, navigating panels, or comparing installer variants. Files are 2.5+ MB, 65,000+ lines — too large for context reads, requires structural dasel queries.

Jamie-BitFlight/enterprise-maven-pom

Dasel v3 selector patterns for Maven POM XML files — use when querying dependency versions, filtering by groupId or scope, extracting module hierarchy from parent POMs, or detecting version conflicts across enterprise multi-module Java projects. Load this skill when working with pom.xml files using dasel.

Jamie-BitFlight/enterprise-spring-xml

Dasel v3 selectors for Spring bean factory XML — use when querying any Spring ApplicationContext XML for bean discovery, dependency wiring, JMS destination mapping, property injection extraction, or cross-bean reference tracing. Load this skill before writing dasel selectors against Spring bean XML files (applicationContext.xml, *_beans.xml, spring-*.xml).

Habilidades Relacionadas