Pushd vs Popd : comprendre enfin la différence et bien les utiliser

Dans un terminal Linux ou macOS, pushd et popd sont deux commandes intégrées au shell Bash (et Zsh) qui gèrent une pile de répertoires. Là où cd remplace le répertoire courant sans garder de trace, pushd empile chaque destination et popd dépile pour revenir en arrière. Comprendre ce mécanisme de pile transforme la navigation entre répertoires en un système de signets temporaires.

La pile de répertoires : le concept technique derrière pushd et popd

Une pile (stack) fonctionne selon le principe LIFO : le dernier élément ajouté est le premier retiré. Chaque appel à pushd ajoute un répertoire au sommet de cette pile et déplace le shell vers ce répertoire. Chaque appel à popd retire le répertoire situé au sommet et ramène le shell au répertoire suivant dans la pile.

A découvrir également : WordPress : framework ou CMS ? Quelle différence ?

La commande dirs affiche l’état complet de la pile à tout moment. Le répertoire affiché le plus à gauche est le répertoire courant, celui le plus à droite est le plus ancien de la pile.

Avec cd, le shell ne conserve que deux positions : le répertoire courant et le précédent (accessible via cd -). La pile de répertoires, elle, peut stocker autant de positions que nécessaire. C’est cette différence structurelle qui rend pushd et popd utiles dès qu’un travail implique plus de deux emplacements.

A lire aussi : Différence : Applications vs. logiciels systèmes - Tout ce qu'il faut savoir !

Femme développeuse travaillant avec un terminal bash dans un espace de coworking moderne

Pushd : syntaxe et comportement dans le terminal Linux

La syntaxe de base est simple : pushd /chemin/vers/repertoire. Le shell se déplace vers le répertoire indiqué et l’empile. Le terminal affiche ensuite la pile complète.

Appelé sans argument, pushd échange les deux premiers éléments de la pile. Le répertoire courant et le précédent permutent, ce qui permet de basculer rapidement entre deux dossiers de travail.

Pushd accepte des arguments numériques préfixés par + ou -. Par exemple, pushd +2 fait pivoter la pile pour que le troisième élément (index 2, en partant de 0) devienne le répertoire courant. Les éléments situés avant lui passent en fin de pile.

  • pushd +0 ne change rien : le sommet reste en place
  • pushd +1 fait remonter le deuxième élément au sommet, déplaçant le premier en fin de pile
  • pushd -0 fait pivoter la pile pour placer le dernier élément (le plus ancien) au sommet

Ces rotations permettent d’accéder à n’importe quel répertoire de la pile sans le retirer. La pile reste intacte, seul l’ordre change.

Popd : retirer un répertoire de la pile et revenir en arrière

Sans argument, popd supprime le sommet de la pile et ramène le shell au répertoire suivant. Le répertoire retiré disparaît définitivement de la pile.

Popd accepte aussi des index. popd +2 retire le troisième élément de la pile sans changer le répertoire courant (sauf si l’index visé est 0). Cette possibilité sert à nettoyer la pile de répertoires devenus inutiles tout en restant concentré sur le dossier de travail actif.

Un piège fréquent avec popd

Popd sur une pile vide génère une erreur, pas un retour silencieux au répertoire home. Le message directory stack empty apparaît et le répertoire courant ne change pas. Dans un script, ne pas vérifier ce cas peut provoquer un comportement inattendu si le script suppose que le répertoire a changé.

Écran de terminal affichant l'historique des commandes pushd et popd dans une bibliothèque universitaire

Pushd et popd dans les scripts Bash : un usage sous-estimé

L’utilisation la plus robuste de pushd et popd se trouve dans les scripts shell. Un pattern courant consiste à entrer dans un répertoire pour y exécuter des commandes, puis revenir au répertoire d’origine :

pushd /var/log > /dev/null suivi des opérations, puis popd > /dev/null. La redirection vers /dev/null supprime l’affichage de la pile, qui serait du bruit dans la sortie d’un script.

L’alternative classique, stocker le répertoire dans une variable (OLD_DIR=$(pwd)) puis revenir avec cd "$OLD_DIR", fonctionne mais supporte mal l’imbrication. Avec pushd et popd, chaque niveau d’imbrication empile et dépile proprement, sans variable supplémentaire et sans risque d’écraser la valeur précédente.

  • Un script qui entre dans trois répertoires successifs peut dépiler dans l’ordre inverse sans gérer manuellement trois variables
  • En cas d’erreur, un trap sur EXIT peut appeler popd pour garantir le retour au répertoire initial
  • Le flag -n (disponible en Bash) modifie la pile sans changer de répertoire courant, ce qui permet de préparer une pile avant de l’utiliser

Pushd et popd hors du shell système : des réimplémentations partielles

Plusieurs environnements modernes reprennent le concept de pile de répertoires sans respecter exactement le comportement Bash. Nuxeo, par exemple, intègre des commandes de navigation de fichiers inspirées du shell Unix dans son interface en ligne de commande. Oracle SQLcl, le client en ligne de commande pour Oracle Database, ne reprend pas directement pushd et popd et préfère des mécanismes de navigation orientés contexte (connexion, schéma, environnement).

Azure Cloud Shell, de son côté, supporte pushd et popd puisqu’il repose sur un Bash standard, mais l’environnement éphémère du shell cloud rend la pile moins pertinente entre deux sessions. Ces variations montrent que la pile de répertoires reste un concept lié au shell local ; dès que la navigation devient plus abstraite (bases de données, plateformes cloud), d’autres modèles prennent le relais.

Pour la navigation quotidienne dans un terminal Linux ou macOS, pushd et popd restent le moyen le plus direct de gérer plusieurs répertoires de travail simultanés. La commande dirs, combinée à l’option -v pour un affichage numéroté, donne à tout moment une vue claire de la pile. Le réflexe à acquérir tient en une phrase : pushd pour aller quelque part en gardant la trace, popd pour revenir.

Les plus plébiscités