Communitygithub.com

Recursos do Bash 5.3

Recursos e melhorias da versão 5.3 do Bash com exemplos práticos. Use ao trabalhar com funcionalidades do Bash 5.3, nova substituição de comandos, GLOBSORT, builtins carregáveis, ou quando o usuário perguntar sobre mudanças, novos recursos ou capacidades específicas desta versão.

O que é Recursos do Bash 5.3?

Esta skill documenta os principais recursos e melhorias introduzidos no Bash 5.3, lançado em julho de 2025. Ela apresenta a revolucionária sintaxe de substituição de comando in-shell (`${ comando; }`), que elimina a criação de subshells e oferece ganhos significativos de desempenho, especialmente em loops. Além disso, cobre a nova variável `GLOBSORT` para ordenação de globs, builtins carregáveis como `kv`, `strptime` e `fltexpr`, melhorias nos builtins existentes (`compgen`, `read`, `source`, `printf`), e conformidade aprimorada com padrões C e POSIX. A skill é útil para desenvolvedores e administradores de sistemas que desejam modernizar seus scripts Bash, otimizar desempenho ou explorar as capacidades mais recentes do interpretador. Ela fornece exemplos práticos de código e um guia de migração do Bash 5.2 para 5.3.

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

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.3

Lançado em julho de 2025, o Bash 5.3 introduz melhorias significativas, incluindo uma sintaxe revolucionária de substituição de comandos, novas variáveis, builtins carregáveis e melhor conformidade com o padrão C.

Substituição de Comando Revolucionária

Execução Eficiente In-Shell: ${ comando; }

Execute comandos sem criar subprocessos, melhorando drasticamente o desempenho:

# Substituição de comando tradicional (cria subshell)
resultado=$(echo "Olá, Mundo")

# NOVO: Substituição de comando in-shell (sem fork!)
# Nota: é necessário um espaço (ou tabulaçao/nova linha/|) após o '{' de abertura
resultado=${ echo "Olá, Mundo"; }

# Exemplo prático: Atribuição rápida de variável
valor_config=${ grep "^timeout=" config.txt | cut -d= -f2; }

# Função de comparação de desempenho
benchmark_substitution() {
    local i
    local inicio fim

    echo "Testando substituição tradicional..."
    inicio="${EPOCHREALTIME}"
    for ((i = 0; i < 1000; i++)); do
        resultado=$(echo "${i}")
    done
    fim="${EPOCHREALTIME}"
    printf 'Tradicional: %.4f segundos\n' \
        "$(awk "BEGIN {print ${fim} - ${inicio}}")"

    echo "Testando nova substituição in-shell..."
    inicio="${EPOCHREALTIME}"
    for ((i = 0; i < 1000; i++)); do
        resultado=${ echo "${i}"; }
    done
    fim="${EPOCHREALTIME}"
    printf 'In-shell: %.4f segundos\n' \
        "$(awk "BEGIN {print ${fim} - ${inicio}}")"
}

benchmark_substitution

Benefícios:

  • Nenhuma sobrecarga de criação de subprocesso
  • Significativamente mais rápido para comandos simples
  • Menor uso de recursos em loops
  • Mesma familiaridade de sintaxe da substituição de comando

Captura com a Variável REPLY: ${| comando; }

Execute comandos e armazene automaticamente a saída em REPLY. Nota: REPLY é local à substituição — seu valor é restaurado após a conclusão, então capture-o imediatamente:

Exemplos de código

Benefícios:

  • Código mais limpo, sem variáveis intermediárias
  • Mecanismo de captura consistente
  • Redução da poluição visual
  • Perfeito para prototipagem rápida

Comparação de Casos de Uso

# Manipulação de strings - use in-shell para eficiência
arquivo="documento.txt"
nome_base=${ echo "${arquivo%.*}"; }
extensao=${ echo "${arquivo##*.}"; }

# Captura de saída - use REPLY para clareza
${| df -h / | tail -1 | awk '{print $5}'; }
uso_disco="${REPLY}"
echo "Uso do disco: ${uso_disco}"

# Pipelines complexos - o tradicional ainda pode ser mais claro
resultado=$(cat arquivo.txt | grep padrao | sort | uniq)

Variável GLOBSORT

Controla a ordem de classificação da expansão de nomes de arquivos e caminhos. O especificador é opcionalmente prefixado com + (ascendente, padrão) ou - (descendente):

Exemplos de código

Especificadores de classificação disponíveis:

  • name — Alfabético por nome do arquivo
  • size — Por tamanho do arquivo
  • mtime — Por data de modificação
  • atime — Por data de acesso
  • ctime — Por data de alteração do inode
  • blocks — Por contagem de blocos alocados
  • numeric — Ordenação numérica pelos dígitos iniciais no nome
  • nosort — Desabilitar ordenação (ordem do glob)
  • Prefixo: + (ascendente, padrão) ou - (descendente)

Builtins Aprimorados

compgen com Armazenamento em Variável

Armazene completações diretamente em uma variável:

Exemplos de código

read com Completamento do Readline (-E)

Entrada interativa com autocompletamento:

# Habilitar completamento do readline durante a leitura
escolher_arquivo() {
    local arquivo

    echo "Digite o nome do arquivo (tab para completar):"
    read -e -r -E -p "> " arquivo

    if [[ -f "${arquivo}" ]]; then
        echo "Selecionado: ${arquivo}"
        return 0
    else
        echo "Arquivo não encontrado: ${arquivo}"
        return 1
    fi
}

escolher_arquivo

# Exemplo prático: Configuração interativa
configurar_app() {
    local arquivo_config

    echo "Selecione o arquivo de configuração:"
    read -e -r -E -p "Config: " arquivo_config

    if [[ -f "${arquivo_config}" ]]; then
        ${| grep -c "^[^#]" "${arquivo_config}"; }
        local num_linhas="${REPLY}"
        echo "Encontradas ${num_linhas} linhas de configuração ativas"
    fi
}

source com Caminho (-p)

Especifique o caminho de busca para scripts carregados:

Exemplos de código

Melhorias no printf

Novas opções para strings multibyte e representações:

# Opções aprimoradas do printf
printf '%q\n' "string com espaços"  # Saída com escaping para shell

# NOVO: Melhorias no suporte a strings multibyte
texto="Olá, Mundo"
printf 'Tamanho: %d bytes\n' "${#texto}"

# Exemplo prático: Construção segura de comandos
construir_comando() {
    local -a args=("$@")
    local arg cmd=""

    for arg in "${args[@]}"; do
        cmd+=$(printf '%q ' "${arg}")
    done

    echo "Comando seguro: ${cmd}"
}

construir_comando ls "-l" "arquivo com espaços.txt"

Novos Builtins Carregáveis

kv - Arrays Chave-Valor

Crie arrays associativos a partir de dados chave-valor. Nota: A existência do builtin kv é confirmada no Bash 5.3; a interface exata mostrada abaixo é ilustrativa — verifique com help kv após carregar:

Exemplos de código

strptime - Análise de Datas

Converta datas textuais em timestamps Unix. Nota: A existência do builtin strptime é confirmada no Bash 5.3; a interface exata mostrada abaixo é ilustrativa — verifique com help strptime após carregar:

Exemplos de código

fltexpr - Cálculos com Ponto Flutuante

Realize aritmética de ponto flutuante sem ferramentas externas:

Exemplos de código

Melhorias no Modo POSIX

Conformidade POSIX aprimorada:

# Habilitar modo POSIX
set -o posix

# Comparações de strings agora seguem regras de localidade
[[ "ä" < "z" ]]  # Comparação dependente de localidade

# Conformidade POSIX melhorada em builtins
# test, trap, wait, bind agora são mais estritamente conformes

# Exemplo prático: Cabeçalho de script portátil
#!/usr/bin/env bash

if [[ "${BASH_VERSINFO[0]}" -ge 5 ]] && [[ "${BASH_VERSINFO[1]}" -ge 3 ]]; then
    # Bash 5.3+ disponível, usar recursos modernos
    USAR_RECURSOS_MODERNOS=1
else
    # Recorrer ao modo POSIX para portabilidade
    set -o posix
    USAR_RECURSOS_MODERNOS=0
fi

Relato de Erros Aprimorado

Mensagens de erro mais detalhadas:

Exemplos de código

Melhorias de Conformidade com o Padrão C

O Bash 5.3 melhora a conformidade com padrões C modernos (o requisito mínimo de compilação continua sendo C90):

  • Não compila mais com compiladores K&R C
  • Base de código modernizada para melhor conformidade
  • Melhores oportunidades de otimização
  • Segurança de tipos aprimorada

Nota: Isso afeta principalmente desenvolvedores que compilam o Bash a partir do código-fonte, não usuários finais.

Melhorias de Desempenho

  • Substituição de comando sem fork (${ cmd; }) reduz drasticamente a sobrecarga
  • Globbing otimizado com GLOBSORT
  • Operações de builtins mais rápidas
  • Menor uso de memória em várias operações
# Benchmark: Substituição tradicional vs nova
benchmark() {
    local iteracoes=10000
    local i inicio fim

    inicio="${EPOCHREALTIME}"
    for ((i = 0; i < iteracoes; i++)); do
        resultado=$(echo teste)
    done
    fim="${EPOCHREALTIME}"
    printf 'Tradicional: %.4f segundos\n' \
        "$(awk "BEGIN {print ${fim} - ${inicio}}")"

    inicio="${EPOCHREALTIME}"
    for ((i = 0; i < iteracoes; i++)); do
        resultado=${ echo teste; }
    done
    fim="${EPOCHREALTIME}"
    printf 'In-shell: %.4f segundos\n' \
        "$(awk "BEGIN {print ${fim} - ${inicio}}")"
}

benchmark

Guia de Migração

Do Bash 5.2 para 5.3

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

# Aproveite a nova substituição de comando para desempenho
# ANTIGO:
for arquivo in *; do
    tamanho=$(stat -f%z "${arquivo}" 2>/dev/null)
done

# NOVO (mais rápido):
for arquivo in *; do
    ${| stat -f%z "${arquivo}" 2>/dev/null; }
    tamanho="${REPLY}"
done

# Use GLOBSORT para melhor processamento de arquivos
GLOBSORT="-mtime"
for arquivo in *.log; do
    processar_log_recente "${arquivo}"
done

# Aproveite novos builtins quando apropriado
# Em vez de: cálculo com awk
# Use: fltexpr para matemática de ponto flutuante

Detecção de Versão

# Verificar recursos do Bash 5.3
if [[ "${BASH_VERSINFO[0]}" -ge 5 ]] && [[ "${BASH_VERSINFO[1]}" -ge 3 ]]; then
    echo "Recursos do Bash 5.3+ disponíveis"
    PODE_USAR_SUBSTITUICAO_INSITU=1
    PODE_USAR_GLOBSORT=1
else
    echo "Versão do Bash: ${BASH_VERSION}"
    PODE_USAR_SUBSTITUICAO_INSITU=0
    PODE_USAR_GLOBSORT=0
fi

Referências

Recursos Adicionais

Para padrões mais amplos de desenvolvimento Bash e melhores práticas, veja:

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-51-features

Bash 5.1 release features and improvements with practical examples. Use when working with Bash 5.1 features, epoch time variables, redirection enhancements, or when user asks about Bash 5.1 changes, new features, or version-specific capabilities.

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-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