pushd, popd vs cd, cd- dans bash et zsh

16

Y a-t-il une différence entre le comportement de pushd / popd dans bash vs zsh? Il semble que dans zsh cd, cd- se comporte exactement de la même façon que pushd / popd (qui ajoute automatiquement le répertoire / pops lorsque cd) tandis que dans bash cd n'affecte pas la pile dir.

Si quelqu'un peut me donner un pointeur, ce serait formidable.

dragonxlwang
la source
Je ne peux parler que de bash: using cddéfinit la variable shell OLDPWDdans le répertoire précédent et cd -est traduite en cd "$OLDPWD".
glenn jackman
@glennjackman, merci. Est-ce à dire que dans bash cd n'a rien à voir avec pushd / popd?
dragonxlwang
Je viens de vérifier, et pushdaussi de mettreOLDPWD
glenn jackman
Et la piste d'atterrissage, retournée par, dirsdétient toujours le PWD comme premier élément
glenn jackman
oui, mais cela a aussi beaucoup de sens si cd ne touche pas les piles de dir qui sont gérées par pushd / popd en bash.
dragonxlwang

Réponses:

17

Ça dépend. Dans zshvous pouvez configurer cdpour pousser automatiquement l'ancien répertoire sur la pile de répertoires, mais ce n'est pas le paramètre par défaut.

Pour autant que je zshsache, les paramètres par défaut se comportent de manière très similaire à bash:

  • cd somedir
    • changer le répertoire en somedir
    • enregistrer le répertoire d'origine dans OLDPWD
    • ensemble PWD="somedir"
    • remplacez l'élément supérieur de la pile de répertoires (comme indiqué par dirs) par somedir(le nombre d'éléments sur la pile ne change pas).
  • cd -:
    • changer le répertoire en $OLDPWD
    • permuter les valeurs de PWDetOLDPWD
    • modifier l'élément supérieur de la pile de répertoires pour refléter (le nouveau) PWD
  • pushd somedir:
    • changer le répertoire en somedir
    • enregistrer le répertoire d'origine dans OLDPWD
    • ensemble PWD="somedir"
    • pousser somedirsur la pile de répertoires (en l'étendant d'un élément)
  • popd:
    • enregistrer le répertoire d'origine dans OLDPWD
    • supprimer le premier élément de la pile de répertoires
    • changer le répertoire en le nouvel élément supérieur de la pile de répertoires
    • défini PWDsur le nouvel élément supérieur de la pile de répertoires

Remarque: Le fait que le répertoire de travail actuel soit considéré comme un élément de la pile de répertoires diffère entre zshet bash. J'ai utilisé bashcomme référence pour les listes ci-dessus.

  • Dans bashle présent répertoire de travail, il est considéré comme l'élément supérieur de la pile de répertoires. Le man 1 bashdit:

    pushd [-n] [dir]

    […] S'ajoute dirà la pile de répertoires en haut, ce qui en fait le nouveau répertoire de travail actuel comme s'il avait été fourni comme argument à la commande cdintégrée. […]

    Printing DIRSTACK( echo ${dirstack[@]}) confirme que le premier élément est identique à $PWD.

  • Dans zshle répertoire de travail actuel, il ne fait pas partie de la pile de répertoires (mais est toujours affiché avec dirs). man 1 zshbuiltinsdit:

    pushd [ -qsLP ] [ arg ]

    […] Modifiez le répertoire courant et poussez l'ancien répertoire courant sur la pile de répertoires. Dans le premier formulaire, remplacez le répertoire actuel par arg. […]

    Le fait d'imprimer dirstack( echo ${dirstack[@]}) et de le comparer à la sortie de dirsdevrait montrer que le PWDne fait pas partie de `dirstack.

Dans les deux shells, dirsle répertoire de travail actuel est imprimé comme premier élément. Toujours dans les deux shells, l'élément de pile de répertoires avec l'index 1fait référence au répertoire qui était en cours avant le dernier pushd. En effet, les tableaux dans zshsont généralement numérotés à partir de 1, alors qu'ils sont numérotés à partir 0de bash. Il y a donc peu de différence pratique


Comme indiqué ci-dessus, ce comportement peut être modifié dans zsh.

Si vous définissez l' AUTO_PUSHDoption dans zsh( setopt autopushd) cd somedirse comporte comme pushd somedir, le répertoire précédent est automatiquement poussé sur la pile de répertoires. C'est probablement le cas sur votre machine. Vous pouvez exécuter setoptpour obtenir une liste d'options qui ne sont pas définies par défaut. Voir, si autopushdapparaît dans la liste.

Mais cela ne change pas cd -pour se comporter comme popd. Au lieu de cela, il pousse simplement $PWDsur la pile de répertoires et change de répertoire en $OLDPWD. Cela signifie que les appels répétés cd -augmenteront la pile de répertoires ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)). Si en fait il se comporte exactement comme popdsur votre système, je suggérerais si cdc'est en fait le builtin ( whence -v cd); il est possible qu'il soit remplacé par un alias ou une fonction.

Comme la pile de répertoires augmentera assez rapidement avec AUTO_PUSHDactivé, vous pouvez limiter sa taille en définissant le paramètre DIRSTACKSIZEà la taille maximale souhaitée.
Vous pouvez également empêcher les doublons en définissant l' PUSHD_IGNORE_DUPSoption.
Pour plus d'options, consultez le manuel .

Adaephon
la source
quel est le but de la pile de répertoires à part le regarder via dirs?
Xerus
@Xerus Il permet de revenir aux répertoires précédemment visités popdsans avoir à taper (ou même connaître) le chemin.
Adaephon