La commande popd retire le répertoire situé au sommet de la pile de répertoires du shell et y déplace le terminal. Combinée avec pushd, elle transforme la navigation entre dossiers en un système de va-et-vient rapide, sans retaper de longs chemins absolus. Son utilité réelle apparaît dès que le travail en terminal implique plus de deux répertoires.
Pile de répertoires shell : le mécanisme que popd exploite
Avant d’utiliser popd, il faut comprendre ce qu’il manipule. Le shell Bash (et Zsh) maintient en mémoire une pile de répertoires, c’est-à-dire une liste ordonnée de chemins empilés les uns sur les autres.
Quand on lance pushd /var/log, deux choses se produisent : le répertoire courant est poussé sur la pile, puis le shell se déplace vers /var/log. La commande dirs affiche l’état complet de cette pile à tout moment.
Popd fait l’opération inverse. Il retire l’entrée du sommet et ramène le terminal au répertoire qui se trouvait juste en dessous. La pile fonctionne selon le principe LIFO (last in, first out) : le dernier répertoire empilé est le premier à en sortir.
Cette mécanique reste invisible tant qu’on n’empile que deux chemins. Elle prend tout son intérêt à partir de trois ou quatre répertoires manipulés en parallèle.

Popd avec index positionnel : retirer un répertoire précis de la pile
L’usage basique de popd (sans argument) dépile le sommet. L’usage avancé accepte un index positionnel pour cibler un répertoire précis dans la pile, sans toucher aux autres.
La syntaxe est popd +N, où N représente la position en partant du sommet (index 0). Par exemple, après avoir empilé quatre répertoires :
popd +0retire le sommet de la pile et déplace le terminal vers le répertoire suivant (comportement identique à popd sans argument)popd +2retire le troisième élément de la pile sans changer le répertoire courant, ce qui nettoie un chemin devenu inutilepopd -0retire le dernier élément de la pile (le fond), en utilisant la notation inverse
Ce mécanisme permet de gérer la pile comme une liste de favoris temporaires. On empile plusieurs dossiers de travail en début de session, puis on les retire au fur et à mesure que les tâches sont terminées.
Vérifier l’état de la pile après chaque opération
Lancer dirs -v affiche la pile avec les index numérotés. Ce réflexe évite les erreurs : retirer le mauvais répertoire dans une pile de cinq entrées peut désorienter la navigation.
En Bash comme en Zsh, dirs -v produit un affichage ligne par ligne. La différence entre les deux shells sur ce point est minime, mais Zsh numérote à partir de 0 par défaut alors que l’affichage peut varier selon la configuration.
Popd dans un script Bash : nettoyage automatique du contexte
Dans un script, popd sert moins à naviguer qu’à restaurer l’état initial du répertoire après une série d’opérations. Le schéma classique consiste à empiler le répertoire de départ, exécuter des commandes dans un autre dossier, puis revenir proprement.
Prenons un script de déploiement qui copie des fichiers de configuration, lance une compilation dans un dossier source, puis revient au point de départ :
pushd /opt/app/src > /dev/null suivi des commandes de build, puis popd > /dev/null en fin de bloc. La redirection vers /dev/null supprime la sortie standard de pushd et popd, qui affichent par défaut le contenu de la pile. Dans un script automatisé, cette sortie parasite encombre les logs si elle n’est pas redirigée.
Associer popd à un trap pour garantir le retour
Si le script échoue entre le pushd et le popd, le répertoire de travail reste celui du pushd. Pour éviter ce piège, la commande trap "popd > /dev/null 2>&1" EXIT placée juste après le pushd garantit que popd sera exécuté à la sortie du script, quelle que soit la raison de l’arrêt (erreur, signal, fin normale).
Ce pattern est plus fiable que de placer un cd - en fin de script, car cd - ne revient qu’au dernier répertoire visité, pas forcément au répertoire initial quand plusieurs déplacements ont eu lieu.

Popd sous Windows cmd : un comportement réseau différent
Sous Linux et macOS, pushd et popd sont des builtins du shell qui manipulent uniquement une pile de chemins locaux. Sous Windows cmd, le comportement diverge sur un point notable.
Quand on exécute pushd \\serveur\partage dans l’invite de commandes Windows, le système mappe automatiquement le chemin réseau UNC sur une lettre de lecteur temporaire. Le popd qui suit ne se contente pas de revenir au répertoire précédent : il supprime aussi ce lecteur mappé, nettoyant l’environnement.
Cette différence a des conséquences directes sur la portabilité des scripts. Un batch Windows qui utilise pushd pour accéder à un partage réseau n’a pas d’équivalent direct en Bash, où le montage réseau passe par des commandes distinctes (mount, sshfs). Tenter de transposer ce pattern tel quel produit une erreur silencieuse.
Popd face à cd et alternatives de navigation terminal
La question revient souvent : pourquoi utiliser popd au lieu de cd - ou d’un alias ? La réponse dépend du nombre de répertoires manipulés simultanément.
cd -ne retient qu’un seul répertoire précédent. Dès qu’un troisième dossier entre en jeu, le premier est oublié- Popd/pushd gèrent une pile complète, ce qui les rend adaptés aux sessions où l’on travaille sur plusieurs dossiers en parallèle (sources, logs, configuration, déploiement)
- Des outils comme
zoxideouautojumpproposent une navigation par fréquence d’usage, mais ne remplacent pas la pile pour un workflow séquentiel planifié - En Zsh, l’option
AUTO_PUSHDempile automatiquement chaque répertoire visité par cd, rendant popd utilisable sans jamais taper pushd explicitement
Popd reste le meilleur choix quand le workflow suit un ordre prévisible : empiler les dossiers nécessaires, travailler, puis dépiler. Pour une navigation exploratoire sans plan, les alternatives basées sur l’historique ou la fréquence sont plus adaptées.
Le point souvent négligé est la combinaison des deux approches. Rien n’empêche d’utiliser zoxide pour la navigation quotidienne et de réserver pushd/popd aux scripts et aux sessions de maintenance où la séquence de répertoires est connue à l’avance. La pile de répertoires du shell ne coûte rien en mémoire et ne modifie pas le comportement de cd si elle n’est pas sollicitée.

