Popd sous Windows, Linux et macOS : ce qui change vraiment

Quand vous tapez popd dans un terminal, la commande retire le dernier répertoire empilé par pushd et vous y ramène. Le principe est identique sur Windows, Linux et macOS. Les différences, elles, se cachent dans les détails : gestion d’index, comportement selon le shell, lettres de lecteur temporaires. Ce sont ces écarts concrets qui posent problème quand on passe d’un système à l’autre.

Popd est un builtin de shell, pas une commande système

C’est le point que la plupart des guides oublient de préciser. Popd n’est pas un programme installé sur votre machine comme le serait un utilitaire classique. C’est une commande intégrée directement dans le shell que vous utilisez.

A lire également : Comment réussir Installing Python with pip sur Windows et macOS ?

Sur Linux et macOS, popd vit dans Bash, Zsh, Fish ou tout autre shell compatible. Sur Windows, popd existe dans CMD (l’invite de commandes) et dans PowerShell, mais avec un fonctionnement différent de celui de Bash.

Pourquoi cette distinction compte ? Parce que le comportement de popd change selon le shell, pas selon le système d’exploitation. Un utilisateur Linux sous Zsh et un utilisateur macOS sous Zsh auront exactement le même popd. En revanche, un utilisateur Windows sous CMD et un autre sous PowerShell n’auront pas la même expérience.

A découvrir également : Inverser clavier après une mise à jour Windows 11 : solutions

Popd sous Bash (Linux et macOS) : la gestion par index

Développeuse travaillant sur macOS avec le terminal zsh et la commande popd dans un salon moderne et épuré

Sous Bash, popd fait plus que simplement revenir au répertoire précédent. La commande accepte un argument positionnel qui permet de cibler un élément précis dans la pile de répertoires.

Prenons un exemple. Vous avez empilé trois dossiers avec pushd :

  • pushd /var/log place /var/log en haut de la pile
  • pushd /etc/nginx ajoute /etc/nginx au-dessus
  • pushd /home/user/projets ajoute ce dossier tout en haut

Avec popd +1, vous retirez l’entrée à l’index 1 de la pile sans forcément changer de répertoire courant. Seul popd +0 (ou popd sans argument) provoque un changement effectif de répertoire.

Popd avec index retire une entrée de la pile sans vous déplacer, sauf quand l’index vaut zéro. Cette mécanique est documentée dans le manuel Bash et fonctionne de manière identique sur Linux et macOS, puisque les deux systèmes partagent les mêmes shells.

Popd sous CMD Windows : pas d’index, mais des lettres de lecteur

Dans l’invite de commandes Windows (CMD), popd se limite à un seul rôle : revenir au dernier répertoire empilé par pushd. Aucun argument positionnel, aucun index. La pile n’est pas consultable via une commande équivalente à dirs sous Bash.

En contrepartie, CMD offre un mécanisme absent des shells Unix. Quand vous utilisez pushd avec un chemin réseau (un partage UNC du type \\serveur\dossier), Windows attribue automatiquement une lettre de lecteur temporaire à ce chemin. Popd, en dépilant, supprime cette lettre de lecteur.

Ce comportement est spécifique à CMD et aux extensions de commande activées par défaut sur les versions récentes de Windows Server. Sur Linux ou macOS, les chemins réseau sont montés autrement (via mount ou des outils comme sshfs), et popd n’a aucun rôle dans la gestion de ces montages.

PowerShell : un popd qui ressemble à Bash sans en être un

PowerShell propose aussi pushd et popd, mais ce sont en réalité des alias vers Push-Location et Pop-Location. La syntaxe ressemble à celle de Bash, la pile de répertoires fonctionne de façon similaire, mais les paramètres diffèrent.

PowerShell gère des piles nommées, ce que ni Bash ni CMD ne proposent. Vous pouvez créer une pile appelée « projet-A » et une autre « projet-B », puis dépiler séparément chacune avec Pop-Location -StackName "projet-A". Cette fonctionnalité est propre à l’écosystème Microsoft.

Ce qui piège les utilisateurs qui changent de système

Deux ingénieurs logiciels comparant les comportements de la commande popd sous Windows PowerShell et Linux dans un bureau moderne

Le vrai problème n’est pas la syntaxe de popd elle-même. C’est l’ensemble des hypothèses qui l’entourent et qui changent d’un environnement à l’autre.

  • Un script Bash utilisant popd +2 ne fonctionnera pas dans CMD Windows, qui ignore les index positionnels
  • Un script CMD qui compte sur l’attribution automatique de lettres de lecteur via pushd/popd n’a pas d’équivalent direct sous Linux ou macOS
  • Un script PowerShell utilisant des piles nommées devra être entièrement réécrit pour Bash ou Zsh
  • La commande dirs, qui affiche la pile sous Bash et Zsh, n’existe pas dans CMD

La commande popd est un cas d’école de fausse portabilité. La syntaxe de base (popd seul) fait la même chose partout. Dès qu’on utilise des arguments ou qu’on s’appuie sur des effets de bord comme les lettres de lecteur, la compatibilité entre systèmes disparaît.

Bash et Zsh sur macOS : une subtilité Apple

Depuis quelques années, macOS utilise Zsh comme shell par défaut à la place de Bash. Les deux shells gèrent popd de façon très proche, mais pas identique dans les messages d’erreur et dans certains cas limites.

Quand la pile est vide, Bash affiche « directory stack empty ». Zsh produit un message légèrement différent. Un script qui teste la sortie texte de popd pour détecter une erreur peut casser lors du passage de Bash à Zsh sur macOS.

Pour les utilisateurs macOS, le réflexe à adopter est de vérifier quel shell est actif (echo $SHELL) avant de supposer que popd se comportera exactement comme sur une distribution Linux où Bash reste souvent le shell par défaut.

La portabilité réelle de popd se limite à son usage le plus simple : empiler un répertoire, le dépiler. Tout le reste dépend du shell, pas du système d’exploitation. Garder cette distinction en tête évite la majorité des erreurs dans les scripts multi-plateformes.