Maîtriser les substitutions de commandes en Bash avec date, basename, dirname et realpath
Apprenez à combiner date, basename, dirname et realpath en substitution de commandes pour écrire des scripts Bash fiables.

- Difficulté
- Facile
La substitution de commandes en Bash sert à récupérer la sortie d'une commande avec $(...) pour la réutiliser immédiatement. Avec date, basename, dirname et realpath, vous pouvez fabriquer des scripts plus fiables pour manipuler des chemins, des noms de fichiers et des sauvegardes horodatées.
Le point clé est simple : utilisez $(commande), puis entourez l'expansion de guillemets doubles quand elle représente un chemin ou un nom de fichier. C'est ce qui évite la plupart des erreurs liées aux espaces et aux caractères spéciaux.
Prérequis
- Savoir lancer un terminal Bash.
- Connaître les variables simples comme
nom="valeur". - Avoir les commandes
date,basenameetdirnamedisponibles, ce qui est courant sur les systèmes GNU/Linux. - Vérifier la présence de
realpathaveccommand -v realpath.
Matériel nécessaire
- Un terminal Bash
- Un dossier de test avec quelques fichiers
- Les commandes date, basename, dirname et realpath
Étapes
Créer une substitution de commandes simple
Commencez par capturer la sortie d'une commande dans une variable. Tapez par exemple
maintenant="$(date +%F)", puis affichez-la avececho "$maintenant".La syntaxe moderne à retenir est $(...). Elle est plus lisible que les anciens accents graves et se combine mieux avec d'autres substitutions.
Construire un nom de fichier horodaté

Utilisez
datedans une substitution pour créer des noms uniques et lisibles. Par exemple :sauvegarde="backup-$(date +%F-%H%M%S).tar.gz".Vous pouvez ensuite l'utiliser sans réécrire le formatage :
echo "$sauvegarde"outar -czf "$sauvegarde" dossier/. Le format+%F-%H%M%Sévite les espaces et reste triable.Extraire le nom d'un fichier avec basename

Servez-vous de
basenamepour récupérer le dernier élément d'un chemin. Exemple :fichier="/tmp/rapports/ventes.csv"puisnom="$(basename "$fichier")".La variable
nomcontiendra iciventes.csv. C'est utile pour journaliser, renommer ou reconstruire un chemin cible.Récupérer le dossier parent avec dirname
Utilisez
dirnamepour isoler le dossier contenant un fichier. Reprenez l'exemple précédent et tapezdossier="$(dirname "$fichier")".Vous obtenez ici
/tmp/rapports. Cette information sert souvent à créer un fichier voisin, un journal local ou une copie dans le même dossier.Normaliser un chemin avec realpath

Avant d'utiliser un chemin fourni par un utilisateur ou construit depuis plusieurs morceaux, convertissez-le en chemin absolu. Exemple :
absolu="$(realpath "$fichier")".Cette étape permet d'éviter les ambiguïtés liées à
.,..et aux chemins relatifs. Elle simplifie aussi les journaux et les comparaisons entre chemins.Assembler les commandes dans un script fiable
Combinez les substitutions pour produire un chemin de sortie propre. Exemple :
source="./docs/rapport final.txt",abs_source="$(realpath "$source")",nom="$(basename "$abs_source")",dossier="$(dirname "$abs_source")"etsortie="$dossier/${nom}-$(date +%F).bak".Le résultat reste lisible et chaque variable a un rôle clair. Pour afficher ce que le script va faire, utilisez par exemple
printf 'Source : %s\nSortie : %s\n' "$abs_source" "$sortie".Tester les valeurs avant d'agir
Affichez toujours les chemins calculés avant une commande sensible comme
mv,cpourm. Un simpleprintf '%s\n' "$abs_source" "$dossier" "$nom" "$sortie"permet de vérifier le résultat réel des substitutions.Vous pouvez aussi stopper le script en cas d'échec d'une commande. Par exemple, si
realpathéchoue, la variable peut être vide ou inutilisable selon votre logique de script.
Erreurs fréquentes & dépannage
- Oublier les guillemets doubles :
basename $fichiercasse facilement avec les espaces. Préférez toujoursbasename "$fichier". - Confondre la commande et sa sortie :
date +%Fexécute une commande, alors que$(date +%F)insère son résultat dans une autre instruction. - Assembler un chemin à la main sans vérifier : un chemin relatif ou contenant
..peut mener au mauvais dossier.realpathaide à lever ce doute. - Supposer le comportement exact de realpath partout : selon le système et les options, la gestion d'un chemin inexistant peut varier. Vérifiez la documentation locale avant d'automatiser ce cas.
- Rendre une ligne illisible : imbriquer trop de substitutions dans une seule commande complique le débogage. Mieux vaut stocker les étapes intermédiaires dans des variables nommées.
Astuces & pour aller plus loin
Préférez des formats de date stables comme +%F ou +%F-%H%M%S pour les noms de fichiers. Ils sont faciles à trier et évitent la plupart des caractères gênants.
Journalisez les chemins absolus plutôt que les chemins relatifs quand vous déboguez un script. Avec realpath, vous voyez tout de suite où le script pointe réellement.
Gardez une variable par idée : source, nom, dossier, sortie. Cette structure réduit les erreurs et rend vos scripts plus simples à relire.
Questions fréquentes
Quelle est la bonne syntaxe pour une substitution de commandes en Bash ?
La syntaxe recommandée est $(commande). Elle remplace la commande par sa sortie standard et reste plus lisible que l'ancienne forme avec accents graves.
Faut-il toujours mettre des guillemets autour de $(...) ?
Dès que la sortie représente un chemin, un nom de fichier ou un texte pouvant contenir des espaces, oui. Utilisez en pratique "$(commande)" ou stockez d'abord la valeur dans une variable puis citez cette variable.
Quand utiliser basename plutôt que dirname ?
Utilisez basename pour obtenir le nom final d'un chemin, par exemple rapport.txt. Utilisez dirname pour récupérer son dossier parent, par exemple /home/alice/docs.
realpath est-il obligatoire dans un script Bash ?
Non, mais il est très utile pour lever les ambiguïtés sur les chemins relatifs. En revanche, le comportement précis à attendre selon l'existence du chemin doit être vérifié sur votre système avec la documentation locale.
Conclusion
Pour construire des scripts Bash fiables sur les chemins et noms de fichiers, retenez surtout ce trio : substitution avec $(...), guillemets doubles et variables intermédiaires claires. Commencez par afficher les valeurs produites par date, basename, dirname et realpath, puis branchez seulement ensuite l'action finale comme cp ou tar.