Fonctionnalités et améliorations de Bash 5.1

Fonctionnalités et améliorations de la version 5.1 de Bash avec des exemples pratiques. Utilisez cette compétence lorsque vous travaillez avec des variables de temps epoch, des améliorations de redirection, ou lorsque l'utilisateur pose des questions sur les changements, nouvelles fonctionnalités ou capacités spécifiques à Bash 5.1.

Qu'est-ce que Fonctionnalités et améliorations de Bash 5.1 ?

Cette compétence fournit un guide complet des fonctionnalités et améliorations introduites dans Bash 5.1, publié en décembre 2020. Elle couvre les nouvelles variables shell comme EPOCHSECONDS et EPOCHREALTIME pour l'accès précis au temps, SRANDOM pour les nombres aléatoires cryptographiques, la syntaxe de redirection améliorée avec `{varname}`, les améliorations des tableaux associatifs et multidimensionnels, l'intégration de Readline 8.1, et les améliorations de gestion des signaux. Chaque section inclut des exemples pratiques et des cas d'utilisation concrets, aidant les développeurs à adopter ces fonctionnalités dans leurs scripts tout en maintenant une compatibilité descendante. La compétence est utile pour les développeurs et administrateurs systèmes travaillant avec Bash sur Linux, macOS ou Windows (via WSL) qui souhaitent tirer parti des dernières capacités de l'interpréteur.

Compatible avec✓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 Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

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

Documentation

Que fait Fonctionnalités et améliorations de Bash 5.1 ?

Publiée en décembre 2020, Bash 5.1 a introduit plusieurs fonctionnalités et améliorations notables pour les scripts shell modernes.

Nouvelles variables shell

EPOCHSECONDS et EPOCHREALTIME

Deux nouvelles variables spéciales pour accéder à l'heure actuelle :

# Obtenir l'horodatage Unix actuel en secondes
echo "Horodatage actuel : ${EPOCHSECONDS}"

# Obtenir l'horodatage Unix actuel avec une précision microseconde
echo "Horodatage haute précision : ${EPOCHREALTIME}"

# Exemple pratique : Benchmarking simple
debut="${EPOCHREALTIME}"
# ... une opération ...
sleep 0.5
fin="${EPOCHREALTIME}"
duree=$(awk "BEGIN {print ${fin} - ${debut}}")
echo "L'opération a pris ${duree} secondes"

# Exemple : Journalisation avec horodatages précis
log_message() {
    printf '[%s.%06d] %s\n' \
        "$(date -d "@${EPOCHSECONDS}" '+%Y-%m-%d %H:%M:%S')" \
        "${EPOCHREALTIME#*.}" \
        "$*"
}

log_message "Démarrage du processus"

Cas d'utilisation :

  • Mesure précise des performances
  • Horodatages haute résolution pour la journalisation
  • Éviter les appels externes à la commande date
  • Chronométrage à précision microseconde dans les scripts

Variable SRANDOM

Nombres aléatoires cryptographiquement forts :

# Générer un nombre aléatoire sécurisé (si disponible)
if [[ -n "${SRANDOM}" ]]; then
    alea_securise="${SRANDOM}"
    echo "Aléatoire sécurisé : ${alea_securise}"
else
    echo "SRANDOM non disponible (nécessite getrandom/getentropy)"
fi

# Exemple pratique : Générer un fichier temporaire avec un nom aléatoire sécurisé
fichier_temp="/tmp/secure_${SRANDOM}_${EPOCHSECONDS}.tmp"

Remarque : SRANDOM nécessite le support système des appels système getrandom() ou getentropy().

Syntaxe de redirection améliorée

Redirection {varname}

Assigner un descripteur de fichier à une variable pour une meilleure gestion des handles de fichiers :

# Ouvrir un descripteur de fichier et le stocker dans une variable
exec {fd}< input.txt
tandis que IFS= read -r -u "${fd}" ligne; faire
    echo "Lu : ${ligne}"
fait
exec {fd}<&-  # Fermer le descripteur de fichier

# Exemple pratique : Gestion de multiples descripteurs
exec {entree_fd}< data.txt
exec {sortie_fd}> results.txt
exec {erreur_fd}> errors.txt

process_data() {
    tandis que IFS= read -r -u "${entree_fd}" ligne; faire
        if validate_ligne "${ligne}"; then
            echo "Traitée : ${ligne}" >&"${sortie_fd}"
        else
            echo "Erreur : ${ligne}" >&"${erreur_fd}"
        fi
    fait
}

process_data
exec {entree_fd}<&-
exec {sortie_fd}>&-
exec {erreur_fd}>&-

Avantages :

  • Descripteurs de fichier nommés plutôt que des nombres magiques
  • Allocation automatique des FD évitant les conflits
  • Code plus lisible et maintenable
  • Suivi plus facile des descripteurs de fichier ouverts

Améliorations des tableaux

Gestion améliorée des tableaux associatifs

Meilleur support pour les opérations complexes sur les tableaux :

# Déclarer un tableau associatif avec typeset
declare -A config=(
    [hote]="localhost"
    [port]="8080"
    [debug]="true"
)

# Expansion de tableau améliorée
for cle in "${!config[@]}"; do
    printf '%s=%s\n' "${cle}" "${config[${cle}]}"
fait

# Exemple pratique : Analyseur de configuration
analyser_config() {
    declare -gA app_config
    local ligne cle valeur

    tandis que IFS='=' read -r cle valeur; faire
        [[ "${cle}" =~ ^[[:space:]]*# ]] && continuer  # Ignorer les commentaires
        [[ -z "${cle}" ]] && continuer                  # Ignorer les lignes vides

        # Supprimer les espaces blancs
        cle="${cle#"${cle%%[![:space:]]*}"}"
        cle="${cle%"${cle##*[![:space:]]}"}"
        valeur="${valeur#"${valeur%%[![:space:]]*}"}"
        valeur="${valeur%"${valeur##*[![:space:]]}"}"

        app_config["${cle}"]="${valeur}"
    fait < config.ini
}

Support des tableaux multidimensionnels

Gestion améliorée des structures de tableau imbriquées.

Exemples de code

Intégration de Readline 8.1

Interaction améliorée avec le texte et la ligne de commande :

Liaisons de touches et historique

# Configurer readline dans ~/.inputrc
# Activer la complétion insensible à la casse
set completion-ignore-case on

# Activer les statistiques visibles pour les complétions
set visible-stats on

# Afficher toutes les complétions immédiatement
set show-all-if-ambiguous on

# Utiliser les couleurs pour le préfixe de complétion
set colored-completion-prefix on

Recherche d'historique améliorée

# Dans votre script ou .bashrc
# Lier Ctrl+R pour la recherche incrémentielle inversée (par défaut, mais améliorée dans 5.1)
bind '"\C-r": reverse-search-history'

# Lier Ctrl+S pour la recherche incrémentielle avant
bind '"\C-s": forward-search-history'

# Gestion améliorée de l'historique
shopt -s histappend           # Ajouter à l'historique
shopt -s cmdhist              # Commandes multi-lignes comme une seule entrée
HISTCONTROL=ignoreboth        # Ignorer les doublons et les espaces de début
HISTSIZE=10000
HISTFILESIZE=20000

Améliorations de la gestion des signaux

Meilleure propagation des signaux dans les sous-shells et les substitutions de processus :

# Gestion améliorée des traps dans les sous-shells
nettoyage() {
    echo "Nettoyage en cours..." >&2
    rm -f "${fichier_temp}"
    exit 130  # 128 + SIGINT
}

trap nettoyage SIGINT SIGTERM

fichier_temp=$(mktemp)

# Le signal se propage correctement à travers les pipelines
tache_longue | traiter_sortie &
pid=$!

# Attendre le job en arrière-plan avec une gestion appropriée des signaux
wait "${pid}" 2>/dev/null
code_sortie=$?

if [[ ${code_sortie} -gt 128 ]]; then
    signal=$((code_sortie - 128))
    echo "Processus terminé par le signal ${signal}" >&2
fi

Corrections de bogues et cas limites

Gestion des sous-shells

Comportement amélioré lors de la création de sous-shells :

# Héritage plus fiable des variables du sous-shell
variable_externe="parent"

(
    # Le sous-shell hérite désormais plus fiablement des variables parentes
    echo "Dans le sous-shell : ${variable_externe}"
    variable_interne="enfant"
)

# variable_externe est toujours accessible, variable_interne ne l'est pas
echo "Après le sous-shell : ${variable_externe}"

Cas limites de correspondance de motifs

Correction des cas limites dans la correspondance de motifs glob :

# Correspondance glob plus fiable avec caractères spéciaux
shopt -s nullglob  # Expansion vide pour les globs sans correspondance
shopt -s extglob   # Correspondance de motifs étendue

# Exemple : Correspondre aux fichiers mais gérer gracieusement l'absence de correspondance
fichiers=(*.txt)
if [[ ${#fichiers[@]} -eq 0 ]]; then
    echo "Aucun fichier .txt trouvé"
else
    printf 'Trouvé : %s\n' "${fichiers[@]}"
fi

Améliorations des performances

  • Expansion de variables plus rapide dans les boucles
  • Opérations sur les tableaux optimisées
  • Utilisation réduite de la mémoire pour les grands tableaux
  • Efficacité améliorée dans la correspondance de motifs

Notes de compatibilité

Mise à niveau depuis Bash 5.0

La plupart des scripts sont compatibles, mais notez :

  • EPOCHSECONDS et EPOCHREALTIME sont nouveaux - vérifiez leur existence si vous ciblez des versions plus anciennes
  • SRANDOM peut ne pas être disponible sur tous les systèmes
  • Certains cas limites obscurs dans le comportement d'expansion ont été corrigés

Vérification de version

# Vérifier la version de Bash avant d'utiliser les fonctionnalités de 5.1
if [[ "${BASH_VERSINFO[0]}" -ge 5 ]] && [[ "${BASH_VERSINFO[1]}" -ge 1 ]]; then
    # Utilisation sécurisée des fonctionnalités de Bash 5.1
    horodatage="${EPOCHSECONDS}"
else
    # Solution de repli pour les versions plus anciennes
    horodatage=$(date +%s)
fi

Références

Ressources supplémentaires

Pour des modèles et bonnes pratiques plus larges de développement Bash, 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-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).

Skills associés