La commande popd retire le répertoire situé en haut de la pile de répertoires (directory stack) et y déplace le shell. Elle fonctionne en tandem avec pushd, qui empile un chemin, et dirs, qui affiche l’état de la pile. Une erreur sur popd ne provoque pas de perte de données, mais elle casse le flux de navigation dans un script ou une session interactive, avec des effets en cascade sur toutes les opérations qui dépendent du répertoire courant.
Comportement de popd selon le shell : bash, zsh et fish
La plupart des tutoriels présentent popd comme une « commande Linux ». C’est trompeur. popd est un builtin du shell, pas un binaire système. Son comportement, ses options et ses messages d’erreur varient d’un shell à l’autre.
A lire aussi : Pip Install -u sur Windows, macOS et Linux : différences à connaître avant de lancer la commande
Sous bash, popd accepte des arguments positionnels comme +N ou -N pour retirer un élément à une position précise de la pile. Sous zsh, la syntaxe est similaire mais l’indexation peut différer selon la configuration de l’option PUSHD_MINUS. Sous fish, popd existe mais la pile de répertoires n’est pas gérée de la même manière : fish utilise une variable dirstack et le comportement global diverge sensiblement.
Le Debian Reference (version 2.140) rappelle que les implémentations des commandes intégrées au shell peuvent varier et qu’il faut consulter la documentation du shell utilisé plutôt que se fier à une commande générique. Consulter help popd dans bash ou zsh donne la documentation du builtin. Taper man popd renvoie souvent une page vide ou une page générique peu utile.
A voir aussi : Accès simplifié à la messagerie académique Nancy-Metz

Erreurs fréquentes avec popd en script et en session interactive
Dépiler une pile vide
L’erreur la plus courante est d’appeler popd alors que la pile ne contient plus aucun répertoire empilé. Le shell renvoie alors popd: directory stack empty. Dans une session interactive, c’est un simple désagrément. Dans un script, si le code de retour n’est pas testé, les commandes suivantes s’exécutent dans un répertoire inattendu.
Déséquilibre pushd/popd dans les scripts
Un pushd sans popd correspondant, ou l’inverse, crée un déséquilibre de pile. Ce problème survient surtout dans les scripts avec des branchements conditionnels ou des boucles : un pushd est exécuté dans une branche, mais le popd associé se trouve dans une autre branche qui n’est jamais atteinte. Chaque pushd doit avoir un popd correspondant, quel que soit le chemin d’exécution.
Supposer que popd existe dans tous les shells
Des scripts écrits pour bash qui utilisent pushd/popd échouent silencieusement quand ils sont exécutés par sh (souvent dash sur Debian et Ubuntu). Le shell POSIX sh ne définit ni pushd ni popd. Le script ne génère pas toujours une erreur bloquante : selon la configuration, dash peut simplement ignorer la commande ou afficher un avertissement, et le reste du script continue dans le mauvais répertoire.
Confusion sur l’indexation +N et -N
Les arguments +N et -N de popd retirent un élément à la Nième position en partant du haut (+) ou du bas (-) de la pile. L’indexation commence à zéro. popd +0 est équivalent à popd sans argument. Utiliser +1 en pensant retirer le premier élément empilé est une erreur d’off-by-one classique.
Bonnes pratiques popd pour des scripts robustes
Quelques règles réduisent la quasi-totalité des problèmes liés à la pile de répertoires.
- Tester le code de retour de
popdaprès chaque appel, ou utiliserset -een début de script pour interrompre l’exécution si une commande échoue. Unpopd || exit 1explicite rend le point de défaillance visible. - Vérifier l’état de la pile avec
dirs -vavant unpopdquand le flux d’exécution est complexe. Cela permet de confirmer que la pile contient bien le répertoire attendu et pas un résidu d’un embranchement précédent. - Préférer des sous-shells
( cd /chemin && commande )à la pairepushd/popdquand le changement de répertoire est ponctuel. Le sous-shell restaure automatiquement le répertoire courant à sa fermeture, sans gestion manuelle de pile. - Spécifier le shebang
#!/bin/bash(et non#!/bin/sh) si le script utilisepushdoupopd. Cela garantit que le shell qui exécute le script supporte bien ces builtins. - Entourer les blocs
pushd/popdd’untrappour exécuterpopdmême en cas d’interruption ou d’erreur :trap 'popd 2>/dev/null' EXITen début de bloc protège contre les sorties non prévues.

Alternative à popd : sous-shell et variable OLDPWD
La pile de répertoires n’est pas le seul mécanisme de navigation en shell. Deux alternatives couvrent la majorité des cas d’usage sans les risques liés à la gestion manuelle de la pile.
Le sous-shell, délimité par des parenthèses ( ), crée un environnement fils. Tout changement de répertoire à l’intérieur disparaît à la fermeture. Le sous-shell élimine le risque de pile déséquilibrée puisqu’il n’y a aucune pile à gérer. La contrepartie : les variables définies dans le sous-shell ne sont pas accessibles après sa fermeture.
La variable OLDPWD, mise à jour automatiquement par cd, stocke le répertoire précédent. Un cd - y retourne. Pour un aller-retour simple entre deux répertoires, c’est plus lisible et moins fragile qu’un couple pushd/popd.
pushd/popd reste pertinent quand la navigation implique trois répertoires ou plus, avec des retours dans un ordre précis. En dehors de ce cas, les alternatives sont plus sûres et produisent des scripts plus faciles à relire.
Déboguer la pile de répertoires avec dirs
La commande dirs affiche le contenu de la pile. Avec l’option -v, elle numérote chaque entrée, ce qui permet de vérifier visuellement l’état avant un popd ciblé. Ajouter dirs -v avant chaque popd en phase de débogage identifie rapidement les déséquilibres.
dirs -c vide entièrement la pile. Cette commande est utile en début de script pour repartir d’un état propre, surtout dans des environnements où des sessions précédentes ont pu laisser des résidus dans la pile.
Le répertoire courant (premier élément affiché par dirs) ne peut pas être retiré par popd : il représente toujours la position actuelle du shell. Tenter de le retirer avec popd +0 sur une pile à un seul élément produit l’erreur de pile vide mentionnée plus haut.
Garder en tête que popd est un outil de navigation, pas de gestion de fichiers. Son périmètre est étroit, ses erreurs sont prévisibles, et la plupart disparaissent avec un shebang correct, un test de code retour et un usage mesuré de la pile.

