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 :
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) :
Spécificateurs de tri disponibles :
name— Alphabétique par nom de fichiersize— Par taille de fichiermtime— Par date de modificationatime— Par date d'accèsctime— Par date de changement d'inodeblocks— Par nombre de blocs allouésnumeric— Tri numérique sur les premiers chiffres du nomnosort— 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 :
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 :
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 :
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 :
fltexpr - Calculs en virgule flottante
Effectuez des calculs en virgule flottante sans outils externes :
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 :
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
- Fichier NEWS de Bash - Notes de version officielles
- Distribution source de GNU Bash 5.3 - Distribution source
- Annonce de Bash 5.3 - Couverture de la version
- Documentation de Readline 8.3 - Améliorations de Readline
Ressources supplémentaires
Pour des modèles de développement Bash plus larges et des bonnes pratiques, voir :
- ../bash-development/SKILL.md - Modèles de développement Bash de base
- ../bash-51-features/SKILL.md - Fonctionnalités de Bash 5.1
- ../bash-52-features/SKILL.md - Fonctionnalités de Bash 5.2