Communitygithub.com

Jamie-BitFlight/bash-53-caracteristiques

Fonctionnalités et améliorations de la version 5.3 de Bash avec des exemples pratiques. À utiliser lorsque vous travaillez avec les fonctionnalités de Bash 5.3, la nouvelle substitution de commande, GLOBSORT, les commandes intégrées chargeables, ou lorsque l'utilisateur pose des questions sur les changements, nouvelles fonctionnalités ou capacités spécifiques à Bash 5.3.

Qu'est-ce que bash-53-caracteristiques ?

Ce skill vous guide à travers les améliorations majeures de Bash 5.3, sorti en juillet 2025. Il détaille la révolutionnaire substitution de commande sans fork (`${ commande; }`) qui améliore considérablement les performances en évitant la création de sous-processus, et la variante `${| commande; }` qui capture automatiquement la sortie dans la variable `REPLY`. Vous apprendrez également à utiliser la variable `GLOBSORT` pour contrôler l'ordre de tri des fichiers lors de l'expansion des chemins, avec des spécificateurs comme `name`, `size`, ou `mtime`. Le skill couvre les nouvelles commandes intégrées chargeables (`kv`, `strptime`, `fltexpr`), les améliorations des commandes existantes (`compgen`, `read`, `printf`, `source`), et les améliorations de conformité POSIX et de rapport d'erreurs. Des exemples de code complets et des benchmarks vous aident à migrer en douceur depuis Bash 5.2 et à tirer parti des nouvelles fonctionnalités pour des scripts plus rapides et plus efficaces.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Fonctionnalités et améliorations de Bash 5.3

Sorti en juillet 2025, Bash 5.3 introduit des améliorations significatives, notamment une syntaxe révolutionnaire de substitution de commande, de nouvelles variables, des commandes intégrées chargeables et une meilleure conformité aux normes C.

Substitution de commande révolutionnaire

Exécution efficace dans le shell : ${ commande; }

Exécutez des commandes sans fork, améliorant considérablement les performances :

# Substitution de commande traditionnelle (crée un sous-shell)
resultat=$(echo "Bonjour, le monde")

# NOUVEAU : Substitution de commande dans le shell (pas de fork !)
# Note : un espace (ou tabulation/nouvelle ligne/|) est requis après l'accolade ouvrante '{'
resultat=${ echo "Bonjour, le monde"; }

# Exemple pratique : affectation rapide de variable
valeur_config=${ grep "^timeout=" config.txt | cut -d= -f2; }

# Fonction de comparaison de performances
benchmark_substitution() {
    local i
    local debut fin

    echo "Test de la substitution traditionnelle..."
    debut="${EPOCHREALTIME}"
    for ((i = 0; i < 1000; i++)); do
        resultat=$(echo "${i}")
    done
    fin="${EPOCHREALTIME}"
    printf 'Traditionnelle : %.4f secondes\n' \
        "$(awk "BEGIN {print ${fin} - ${debut}}")"

    echo "Test de la nouvelle substitution dans le shell..."
    debut="${EPOCHREALTIME}"
    for ((i = 0; i < 1000; i++)); do
        resultat=${ echo "${i}"; }
    done
    fin="${EPOCHREALTIME}"
    printf 'Dans le shell : %.4f secondes\n' \
        "$(awk "BEGIN {print ${fin} - ${debut}}")"
}

benchmark_substitution

Avantages :

  • Pas de surcharge de création de sous-processus
  • Significativement plus rapide pour les commandes simples
  • Utilisation réduite des ressources dans les boucles
  • Syntaxe familière identique à la substitution de commande

Capture via la variable REPLY : ${| commande; }

Exécutez des commandes et stockez automatiquement la sortie dans REPLY. Note : REPLY est locale à la substitution — sa valeur est restaurée après l'achèvement, donc capturez-la immédiatement :

Exemples de code

Avantages :

  • Code plus propre sans variables intermédiaires
  • Mécanisme de capture cohérent
  • Encombrement visuel réduit
  • Idéal pour le prototypage rapide

Comparaison des cas d'utilisation

# Manipulation de chaînes - utiliser dans le shell pour l'efficacité
nom_fichier="document.txt"
base=${ echo "${nom_fichier%.*}"; }
extension=${ echo "${nom_fichier##*.}"; }

# Capture de sortie - utiliser REPLY pour plus de clarté
${| df -h / | tail -1 | awk '{print $5}'; }
utilisation_disque="${REPLY}"
echo "Utilisation disque : ${utilisation_disque}"

# Pipelines complexes - la méthode traditionnelle peut être plus claire
resultat=$(cat fichier.txt | grep motif | sort | uniq)

Variable GLOBSORT

Contrôlez l'ordre de tri de l'expansion des noms de fichiers et chemins. Le spécificateur peut être optionnellement préfixé par + (ascendant, par défaut) ou - (descendant) :

Exemples de code

Spécificateurs de tri disponibles :

  • name — Alphabétique par nom de fichier
  • size — Par taille de fichier
  • mtime — Par date de modification
  • atime — Par date d'accès
  • ctime — Par date de changement d'inode
  • blocks — Par nombre de blocs alloués
  • numeric — Tri numérique sur les premiers chiffres du nom
  • nosort — Désactiver le tri (ordre du glob)
  • Préfixe : + (ascendant, par défaut) ou - (descendant)

Commandes intégrées améliorées

compgen avec stockage dans une variable

Stockez les complétions directement dans une variable :

Exemples de code

read avec complétion Readline (-E)

Saisie interactive avec autocomplétion :

# Activer la complétion readline pendant read
choisir_fichier() {
    local fichier

    echo "Entrez le nom du fichier (tab pour la complétion) :"
    read -e -r -E -p "> " fichier

    if [[ -f "${fichier}" ]]; then
        echo "Sélectionné : ${fichier}"
        return 0
    else
        echo "Fichier non trouvé : ${fichier}"
        return 1
    fi
}

choisir_fichier

# Exemple pratique : Configuration interactive
configurer_app() {
    local fichier_config

    echo "Sélectionnez le fichier de configuration :"
    read -e -r -E -p "Config : " fichier_config

    if [[ -f "${fichier_config}" ]]; then
        ${| grep -c "^[^#]" "${fichier_config}"; }
        local nb_lignes="${REPLY}"
        echo "Trouvé ${nb_lignes} lignes de configuration actives"
    fi
}

source avec chemin (-p)

Spécifiez le chemin de recherche pour les scripts sourcés :

Exemples de code

Améliorations de printf

Nouvelles options pour les chaînes multi-octets et les représentations :

# Options printf améliorées
printf '%q\n' "chaîne avec espaces"  # Sortie quotée pour le shell

# NOUVEAU : Améliorations de la prise en charge des chaînes multi-octets
texte="Bonjour, 世界"
printf 'Longueur : %d octets\n' "${#texte}"

# Exemple pratique : Construction sécurisée de commande
construire_commande() {
    local -a args=("$@")
    local arg cmd=""

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

    echo "Commande sécurisée : ${cmd}"
}

construire_commande ls "-l" "fichier avec espaces.txt"

Nouvelles commandes intégrées chargeables

kv - Tableaux clé-valeur

Créez des tableaux associatifs à partir de données clé-valeur. Note : L'existence de la commande intégrée kv est confirmée dans Bash 5.3 ; l'interface exacte ci-dessous est illustrative — vérifiez avec help kv après chargement :

Exemples de code

strptime - Analyse de dates

Analysez des dates textuelles en horodatages Unix. Note : L'existence de la commande intégrée strptime est confirmée dans Bash 5.3 ; l'interface exacte ci-dessous est illustrative — vérifiez avec help strptime après chargement :

Exemples de code

fltexpr - Calculs en virgule flottante

Effectuez des calculs en virgule flottante sans outils externes :

Exemples de code

Améliorations du mode POSIX

Conformité POSIX améliorée :

# Activer le mode POSIX
set -o posix

# Les comparaisons de chaînes suivent désormais les règles de locale
[[ "ä" < "z" ]]  # Comparaison dépendante de la locale

# Conformité POSIX améliorée dans les commandes intégrées
# test, trap, wait, bind sont tous plus strictement conformes

# Exemple pratique : En-tête de script portable
#!/usr/bin/env bash

if [[ "${BASH_VERSINFO[0]}" -ge 5 ]] && [[ "${BASH_VERSINFO[1]}" -ge 3 ]]; then
    # Bash 5.3+ disponible, utiliser les fonctionnalités modernes
    USE_MODERN_FEATURES=1
else
    # Repli sur le mode POSIX pour la portabilité
    set -o posix
    USE_MODERN_FEATURES=0
fi

Rapport d'erreurs amélioré

Messages d'erreur plus détaillés :

Exemples de code

Améliorations de la conformité aux normes C

Bash 5.3 améliore la conformité aux normes C modernes (le minimum de compilation reste C90) :

  • Ne compile plus avec les compilateurs K&R C
  • Base de code modernisée pour une meilleure conformité
  • Meilleures opportunités d'optimisation
  • Sûreté de typage améliorée

Note : Cela affecte principalement les développeurs compilant Bash à partir des sources, pas les utilisateurs finaux.

Améliorations des performances

  • La substitution de commande sans fork (${ cmd; }) réduit considérablement la surcharge
  • Globbing optimisé avec GLOBSORT
  • Opérations intégrées plus rapides
  • Utilisation mémoire réduite dans diverses opérations
# Benchmark : Substitution traditionnelle vs nouvelle
benchmark() {
    local iterations=10000
    local i debut fin

    debut="${EPOCHREALTIME}"
    for ((i = 0; i < iterations; i++)); do
        resultat=$(echo test)
    done
    fin="${EPOCHREALTIME}"
    printf 'Traditionnelle : %.4f secondes\n' \
        "$(awk "BEGIN {print ${fin} - ${debut}}")"

    debut="${EPOCHREALTIME}"
    for ((i = 0; i < iterations; i++)); do
        resultat=${ echo test; }
    done
    fin="${EPOCHREALTIME}"
    printf 'Dans le shell : %.4f secondes\n' \
        "$(awk "BEGIN {print ${fin} - ${debut}}")"
}

benchmark

Guide de migration

De Bash 5.2 à 5.3

La plupart des scripts sont compatibles, mais considérez :

# Profitez de la nouvelle substitution de commande pour les performances
# ANCIEN :
for fichier in *; do
    taille=$(stat -f%z "${fichier}" 2>/dev/null)
done

# NOUVEAU (plus rapide) :
for fichier in *; do
    ${| stat -f%z "${fichier}" 2>/dev/null; }
    taille="${REPLY}"
done

# Utilisez GLOBSORT pour un meilleur traitement des fichiers
GLOBSORT="-mtime"
for fichier in *.log; do
    traiter_log_recent "${fichier}"
done

# Exploitez les nouvelles commandes intégrées si approprié
# Au lieu de : calcul awk
# Utilisez : fltexpr pour les calculs en virgule flottante

Détection de version

# Vérifier les fonctionnalités de Bash 5.3
if [[ "${BASH_VERSINFO[0]}" -ge 5 ]] && [[ "${BASH_VERSINFO[1]}" -ge 3 ]]; then
    echo "Fonctionnalités Bash 5.3+ disponibles"
    CAN_USE_INSITU_SUBSTITUTION=1
    CAN_USE_GLOBSORT=1
else
    echo "Version de Bash : ${BASH_VERSION}"
    CAN_USE_INSITU_SUBSTITUTION=0
    CAN_USE_GLOBSORT=0
fi

Références

Ressources supplémentaires

Pour des modèles de développement Bash plus larges et des bonnes pratiques, voir :

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

Skills associés