Popd en détail : options utiles, alias malins et exemples commentés

Quand on navigue entre plusieurs répertoires dans un terminal, popd reste la commande la moins bien comprise du trio pushd/popd/dirs. La plupart des guides se contentent d’expliquer qu’elle « dépile le sommet » de la pile de répertoires. Ce raccourci masque des options et des combinaisons qui changent la façon de gérer une session de travail complexe.

Cet article mesure l’écart entre l’usage basique de popd et ses capacités réelles : options +N, -N, -n, alias productifs et comportement selon le shell.

A lire également : Scalabilité en entreprise : comprendre sa définition et son importance

Options de popd comparées : suppression par position et option -n

Syntaxe Effet sur la pile Change le répertoire courant ?
popd (sans argument) Retire l’entrée au sommet (position 0) Oui, vers la nouvelle position 0
popd +N Retire la N-ième entrée en comptant depuis le sommet (0 = sommet) Oui si N = 0, non sinon
popd -N Retire la N-ième entrée en comptant depuis le bas de la pile Oui si l’entrée retirée est le sommet, non sinon
popd -n Retire le sommet de la pile mais ne change pas le répertoire courant Non
popd -n +N Retire la N-ième entrée sans changer de répertoire Non

La colonne « Change le répertoire courant ? » est la plus mal documentée. Beaucoup de développeurs découvrent par accident que popd +2 ne les déplace pas : seul popd sans argument ou popd +0 provoque un changement de répertoire.

Développeuse consultant des exemples commentés de la commande popd avec des alias bash sur un laptop dans un appartement

A lire aussi : Quel antivirus choisir en 2021 ?

Nettoyer la pile sans se déplacer : popd -n en pratique

L’option -n mérite une section à part parce qu’elle résout un problème courant dans les scripts. Quand un pushd a empilé un répertoire temporaire (un dossier de build, un mount point), on veut souvent retirer cette entrée de la pile sans quitter le répertoire de travail actuel.

Exemple commenté :

$ dirs -v
0 ~/projet
1 /tmp/build
2 ~/config

$ popd -n +1
Résultat : /tmp/build disparaît de la pile. Le répertoire courant reste ~/projet. La pile affiche maintenant ~/projet en position 0 et ~/config en position 1.

Sans -n, la même commande popd +1 retirerait aussi /tmp/build sans changer de répertoire (puisque +1 n’est pas le sommet). En revanche, un simple popd sans argument retirerait ~/projet du sommet et ferait un cd vers /tmp/build, ce qui n’est probablement pas l’intention.

Combiner -n avec +N permet de sculpter la pile sans effet de bord sur le répertoire de travail. Dans un script Bash qui enchaîne des opérations dans plusieurs dossiers, cette combinaison évite les cd parasites qui cassent la logique de navigation.

Alias popd pour gagner du temps dans le terminal

Taper popd n’est pas long, mais taper popd +2 ou popd -n +1 plusieurs fois par session l’est. Quelques alias bien choisis rendent la pile exploitable au quotidien sans forcer la mémoire musculaire.

  • alias pp='popd' : raccourci minimal pour dépiler et revenir au répertoire précédent. Deux lettres au lieu de quatre, le gain se cumule sur une journée de travail.
  • alias ppn='popd -n' : retire le sommet de la pile sans se déplacer. Utile après un pushd exploratoire dont on ne veut pas garder la trace.
  • alias d='dirs -v' : affiche la pile numérotée verticalement. Sans cet alias, on finit par ne jamais vérifier l’état de la pile, ce qui rend popd +N inutilisable en pratique.
  • alias pu='pushd' : complète le duo. Avoir pu et pp dans le même .bashrc crée un flux de navigation cohérent.

Un point souvent ignoré : ces alias fonctionnent dans Bash et Zsh sans modification. Les deux shells implémentent popd comme un builtin avec la même sémantique de pile. Zsh ajoute quelques options propres (setopt AUTO_PUSHD pour empiler automatiquement chaque cd), mais les alias ci-dessus restent compatibles.

Popd dans un script Bash : piège du sous-shell

Utiliser popd dans un script pose un problème que le terminal interactif ne montre jamais. Chaque sous-shell ($(commande), pipe, bash -c) possède sa propre copie de la pile de répertoires. Un popd exécuté dans un sous-shell n’affecte pas la pile du shell parent.

Conséquence concrète : si un script fait result=$(pushd /tmp && ls && popd), la pile du shell appelant reste intacte. Le popd dans un sous-shell ne modifie que la pile locale, ce qui provoque des piles « fantômes » qui grossissent sans jamais se vider.

La parade consiste à maintenir pushd et popd dans le même niveau de shell. Quand ce n’est pas possible, un cd - classique ou une variable qui stocke le répertoire d’origine (OLD_DIR=$(pwd)) reste plus fiable qu’une pile de répertoires partagée entre contextes d’exécution.

Deux développeurs collaborant sur des options avancées de la commande popd dans un terminal bash en open space professionnel

Popd sous Windows CMD : une sémantique différente

Chemins réseau et lettres de lecteur temporaires

La commande popd existe aussi dans l’invite de commandes Windows. Sa logique est proche du modèle Linux (dépiler un répertoire mémorisé par pushd), mais avec une particularité liée aux chemins UNC.

Sous Windows, pushd \\serveur\partage attribue automatiquement une lettre de lecteur temporaire au partage réseau. Le popd Windows supprime cette lettre de lecteur en plus de dépiler. Oublier le popd dans un script batch laisse des lettres de lecteur orphelines qui persistent jusqu’à la fermeture de la session.

Cette différence de comportement est absente de la quasi-totalité des tutoriels centrés sur Linux. Pour les administrateurs qui travaillent sur les deux systèmes, garder en tête que popd sous CMD a un effet de nettoyage réseau, pas seulement un changement de répertoire.

Compatibilité PowerShell

PowerShell fournit Push-Location et Pop-Location, avec des alias intégrés pushd et popd. La pile est la même, mais PowerShell permet de nommer des piles distinctes via le paramètre -StackName, une fonctionnalité sans équivalent direct en Bash.

La commande popd, quelle que soit la plateforme, reste un outil de navigation sous-exploité. La différence entre un usage basique et un usage productif tient à trois éléments : connaître l’option -n, vérifier la pile avec dirs -v avant de dépiler, et éviter les sous-shells quand la pile doit rester cohérente.

D'autres articles sur le site