La commande popd retire un répertoire de la pile et y déplace le shell. Associée à pushd et à la commande dirs, elle forme un système de navigation entre répertoires qui repose sur une structure de données en pile (LIFO). Comprendre ce mécanisme permet de mesurer ses avantages réels par rapport à cd, mais aussi ses limites dans les environnements de production actuels.
Pile de répertoires bash : comportement interne de pushd, popd et dirs
La pile de répertoires est une liste ordonnée maintenue par le shell. Chaque appel à pushd ajoute un chemin au sommet et change le répertoire courant. Chaque appel à popd retire le sommet et revient au répertoire précédent. La commande dirs affiche l’état complet de la pile à tout instant.
A lire en complément : Gérer vos documents avec OpenOffice
Ce fonctionnement repose sur le principe LIFO : le dernier répertoire empilé est le premier récupéré. La pile persiste tant que la session shell reste ouverte, ce qui la distingue d’un simple historique de commandes cd.
| Commande | Action sur la pile | Répertoire courant après exécution |
|---|---|---|
| pushd /var/log | Empile /var/log au sommet | /var/log |
| pushd /etc/nginx | Empile /etc/nginx au sommet | /etc/nginx |
| dirs -v | Aucune modification | Inchangé (affiche la liste indexée) |
| popd | Retire /etc/nginx du sommet | /var/log |
| popd | Retire /var/log du sommet | Répertoire initial |
L’option dirs -v affiche chaque entrée avec son index numérique. Ces index permettent ensuite d’accéder directement à un répertoire précis dans la pile avec pushd +N ou pushd -N, sans dépiler les éléments intermédiaires.
A lire également : Comment nettoyer écran ordi après des traces de doigts et de gras ?

Syntaxe popd et options de rotation dans la pile
La syntaxe de base est simple : popd sans argument retire le sommet. Les options +N et -N permettent de retirer un élément à une position arbitraire.
- popd +N retire l’entrée à la position N en comptant depuis le sommet (index 0)
- popd -N retire l’entrée à la position N en comptant depuis le bas de la pile
- popd sans argument équivaut à popd +0 et change le répertoire courant vers le nouveau sommet
Le piège fréquent concerne la différence entre retirer un élément et naviguer vers lui. Retirer un élément au milieu de la pile avec popd +2, par exemple, ne modifie pas le répertoire courant. Seul popd +0 (ou popd sans argument) provoque un changement de répertoire.
Rotation sans suppression avec pushd
Pour réorganiser la pile sans perdre d’entrées, pushd +N fait pivoter la pile de sorte que l’élément N devienne le sommet. Ce mécanisme complète popd : l’un navigue en conservant la pile, l’autre navigue en la réduisant.
Comparaison pushd/popd et cd pour la navigation Linux
La commande cd ne maintient aucune pile. Elle offre un seul raccourci de retour : cd – ramène au répertoire précédent, mais uniquement au dernier. Dès qu’un troisième répertoire entre en jeu, cd – perd la trace du premier.
| Critère | cd / cd – | pushd / popd |
|---|---|---|
| Nombre de répertoires mémorisés | Un seul (le précédent) | Autant que d’appels pushd |
| Visualisation de l’historique | Aucune commande native | dirs -v affiche toute la pile |
| Accès direct à un répertoire éloigné | Chemin complet obligatoire | pushd +N par index |
| Comportement en script non interactif | Prévisible, sans état partagé | Dépend de l’état courant de la pile |
| Compatibilité shells modernes (fish, nushell) | Universel | Partiel ou absent nativement |
La colonne « Comportement en script non interactif » mérite une attention particulière. La pile de répertoires introduit un état mutable dans le shell, ce qui peut rendre le débogage plus complexe lorsque plusieurs fonctions empilent et dépilent dans le même script.

Pile de répertoires dans les scripts shell et pipelines CI/CD
Dans un contexte interactif, pushd et popd accélèrent la navigation quotidienne. Dans les scripts et les pipelines d’intégration continue, la situation est différente.
Les équipes SRE et DevOps privilégient désormais les chemins absolus et immuables dans les pipelines CI/CD. La raison : la dépendance à l’état d’une pile de répertoires est considérée comme une source de non-déterminisme, particulièrement dans les déploiements parallélisés où plusieurs processus shell coexistent.
Un script qui utilise pushd /var/www/releases/current puis popd fonctionne correctement tant qu’il s’exécute de façon séquentielle. Dès que deux tâches parallèles partagent un même contexte shell, l’ordre des empilements et dépilements devient imprévisible.
Quand pushd/popd reste pertinent dans un script
- Scripts séquentiels courts qui alternent entre deux ou trois répertoires fixes
- Scripts d’administration locale où le retour au répertoire de départ est garanti par un popd en fin de bloc
- Fonctions encapsulées avec pushd en entrée et popd en sortie, isolant la pile du reste du script
Pour les pipelines de production, cd avec chemin absolu suivi d’un cd explicite de retour reste plus lisible et plus sûr qu’un couple pushd/popd.
Shells modernes et alternatives à la pile de répertoires
Les shells récents comme fish et nushell proposent une approche différente. Plutôt qu’une pile LIFO manipulée manuellement, ils offrent une visualisation enrichie de l’historique de navigation : liste interactive des répertoires visités, recherche fuzzy intégrée dans l’invite, affichage graphique des chemins récents.
Ce modèle dépasse la logique pushd/popd en supprimant la contrainte d’ordre LIFO. L’utilisateur accède à n’importe quel répertoire récent sans se soucier de l’ordre d’empilement. En revanche, ces shells ne sont pas toujours disponibles sur les systèmes de production, où bash et sh restent la norme.
Depuis PowerShell 7.4, Microsoft recommande les cmdlets comme Set-Location et les providers de chemin pour la navigation scriptée. Les commandes pushd et popd y sont maintenues pour compatibilité, sans être mises en avant dans les guides de scripting récents.
La pile de répertoires reste un outil efficace en session interactive bash, surtout pour les administrateurs système qui naviguent entre des arborescences profondes. Pour les scripts automatisés et les environnements CI/CD, les chemins absolus éliminent toute ambiguïté liée à l’état du shell. Le choix dépend du contexte d’exécution, pas d’une supériorité technique générale d’une méthode sur l’autre.

