web-dev-qa-db-fra.com

Poussad, POPD VS CD, CD-In Bash et ZSH

Y a-t-il une différence entre le comportement de Poussad/POPD à Bash vs ZSH? Il semble que CD de ZSH, CD- se comporte exactement la même chose que Poussine/POPD (qui ajoute automatiquement le répertoire de POPS lorsque CD) tandis que dans BASH CD n'affecte pas la pile dir.

Si quelqu'un peut me donner un pointeur qui serait génial.

16
dragonxlwang

Ça dépend. Dans zsh Vous pouvez configurer cd pour appuyer automatiquement l'ancien répertoire de la pile d'annuaire, mais ce n'est pas le paramètre par défaut.

Pour autant que je puisse dire zsh avec les paramètres par défaut se comporte très similaire à bash:

  • cd somedir
    • changer le répertoire en somedir
    • enregistrez 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) avec somedir (le nombre d'éléments sur la pile ne change pas).
  • cd -:
    • changer le répertoire en $OLDPWD
    • échangez des valeurs de PWD et OLDPWD
    • modifier l'élément supérieur de la pile de répertoires à refléter (le nouveau) PWD
  • pushd somedir:
    • changer le répertoire en somedir
    • enregistrer le répertoire d'origine dans OLDPWD
    • ensemble PWD="somedir"
    • Push somedir sur la pile de répertoires (en prolongeant 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 sur le nouvel élément supérieur de la pile d'annuaires
    • définir PWD sur le nouvel élément supérieur de la pile de répertoires

Remarque: si le présent répertoire de travail est considéré comme un élément de la pile de répertoires diffère entre zsh et bash. J'ai utilisé bash comme référence pour les listes ci-dessus.

  • Dans bash Le présent répertoire de travail est considéré comme l'élément supérieur de la pile d'annuaires. Les man 1 bash dit:

    pushd [-n] [dir]

    [...] ajoute dir à la pile de répertoires en haut, ce qui en fait le nouvel répertoire de travail actuel comme s'il avait été fourni comme argument sur le cd intégré. [...]

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

  • Dans zsh Le présent répertoire de travail ne fait pas partie de la pile de répertoires (mais toujours affichée avec dirs). man 1 zshbuiltins dit:

    pushd [ -qsLP ] [ arg ]

    [...] Modifiez le répertoire actuel et appuyez sur l'ancien répertoire actuel sur la pile de répertoires. Dans la première forme, modifiez le répertoire actuel en Arg. [...]

    Impression dirstack (echo ${dirstack[@]}) et le comparer à la sortie de dirs devrait montrer que le PWD ne fait pas partie de "DRISTACK.

Dans les deux coquilles dirs imprime le présent répertoire de travail comme premier élément. Également dans les deux obus, l'élément de pile de répertoires avec l'index 1 fait référence au répertoire qui était à jour avant le dernier pushd. C'est-à-dire parce que les tableaux dans zsh sont généralement numérotés de 1, alors qu'ils sont numérotés de 0 dans bash. Donc, il y a peu de différence pratique


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

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

Mais cela ne modifie pas cd - Pour se comporter comme popd. Au lieu de cela, il pousse simplement $PWD sur la pile d'annuaires et modifier le répertoire à $OLDPWD. Cela signifie à plusieurs reprises cd - va réellement cultiver la pile d'annuaire (($PWD $OLDPWD $PWD $OLDPWD $PWD …)). Si cela se comporte réellement exactement comme popd sur votre système, je vous suggérerais si cd est en fait la construction (whence -v cd); Il est possible que c'est remplacé par un alias ou une fonction.

Lorsque la pile de répertoires se développera assez rapidement avec AUTO_PUSHD Activé, vous pouvez limiter sa taille en réglant le paramètre DIRSTACKSIZE à la taille maximale souhaitée.
[.____] Vous pouvez également éviter les doublons en définissant le PUSHD_IGNORE_DUPS option.
Pour plus d'options, consultez le manuel .

18
Adaephon