pushd, popd vs cd, cd- en bash y zsh

16

¿Hay alguna diferencia entre el comportamiento de pushd / popd en bash vs zsh? Parece que en zsh cd, cd- se comporta exactamente igual que pushd / popd (que agrega el directorio / pops automáticamente cuando cd) mientras que en bash cd no afecta la pila de directorios.

Si alguien me puede dar un puntero, sería genial.

dragonxlwang
fuente
Solo puedo hablar con bash: el uso cdestablece la variable de shell OLDPWDen el directorio anterior y cd -se traduce a cd "$OLDPWD".
Glenn Jackman
@glennjackman, gracias. ¿Eso significa que en bash cd no tiene nada que ver w / pushd / popd?
dragonxlwang
Acabo de comprobar, y pushdtambién estableceOLDPWD
Glenn Jackman
Y el dirstack, devuelto por dirssiempre tiene el PWD como primer elemento
glenn jackman
sí, pero también tiene mucho sentido si cd no toca las pilas de directorios que se manejan mediante pushd / popd en bash.
dragonxlwang

Respuestas:

17

Depende. En zshpuede configurar cdpara empujar el directorio antiguo en la pila de directorios automáticamente, pero no es la configuración predeterminada.

Por lo que puedo decir zshcon la configuración predeterminada, se comporta de manera muy similar a bash:

  • cd somedir
    • cambiar directorio a somedir
    • guardar el directorio original en OLDPWD
    • conjunto PWD="somedir"
    • reemplace el elemento superior de la pila del directorio (como se muestra en dirs) con somedir(el número de elementos en la pila no cambia).
  • cd -:
    • cambiar directorio a $OLDPWD
    • intercambiar valores de PWDyOLDPWD
    • modificar el elemento superior de la pila de directorios para reflejar (el nuevo) PWD
  • pushd somedir:
    • cambiar directorio a somedir
    • guardar el directorio original en OLDPWD
    • conjunto PWD="somedir"
    • presione somedirsobre la pila de directorios (extendiéndola en un elemento)
  • popd:
    • guardar el directorio original en OLDPWD
    • eliminar el primer elemento de la pila de directorios
    • cambiar el directorio al nuevo elemento superior de la pila de directorios
    • establecer PWDen el nuevo elemento superior de la pila de directorios

Nota: Si el directorio de trabajo actual se considera un elemento de la pila de directorios difiere entre zshy bash. Utilicé bashcomo referencia para las listas anteriores.

  • En bashel presente directorio de trabajo se considera el elemento superior de la pila de directorios. El man 1 bashdice:

    pushd [-n] [dir]

    [...] Se agrega dira la pila de directorios en la parte superior, convirtiéndolo en el nuevo directorio de trabajo actual como si hubiera sido suministrado como argumento para el cdbuiltin incorporado. [...]

    Printing DIRSTACK( echo ${dirstack[@]}) confirma que el primer elemento es idéntico a $PWD.

  • En zshel presente directorio de trabajo no es parte de la pila de directorios (pero aún se muestra con dirs). man 1 zshbuiltinsdice:

    pushd [ -qsLP ] [ arg ]

    […] Cambie el directorio actual y empuje el directorio actual anterior a la pila de directorios. En la primera forma, cambie el directorio actual a arg. [...]

    Imprimir dirstack( echo ${dirstack[@]}) y compararlo con la salida de dirsdebería mostrar que PWDno es parte de `dirstack.

En ambos shells dirsimprime el directorio de trabajo actual como primer elemento. También en ambos shells, el elemento de pila de directorio con el índice se 1refiere al directorio que era actual antes del último pushd. Esto se debe a que las matrices en zshgeneralmente están numeradas desde 1, mientras que están numeradas desde 0adentro bash. Entonces hay poca diferencia práctica


Como se dijo anteriormente, este comportamiento se puede modificar zsh.

Si configura la AUTO_PUSHDopción en zsh( setopt autopushd) se cd somedircomporta como pushd somedir, el directorio anterior se inserta en la pila de directorios automáticamente. Este es probablemente el caso en su máquina. Puede ejecutar setoptpara obtener una lista de opciones que no están configuradas de manera predeterminada. Vea, si autopushdaparece en la lista.

Pero esto no se modifica cd -para comportarse como popd. En cambio, simplemente empuja $PWDa la pila de directorios y cambia el directorio a $OLDPWD. Eso significa que llamar repetidamente cd -realmente aumentará la pila de directorios ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …)). Si realmente se comporta exactamente como popden su sistema, sugeriría si cdes realmente el builtin ( whence -v cd); es posible que se reemplace con un alias o función.

Como la pila de directorios crecerá bastante rápido con AUTO_PUSHDhabilitado, puede limitar su tamaño configurando el parámetro DIRSTACKSIZEal tamaño máximo deseado.
También puede evitar duplicados configurando la PUSHD_IGNORE_DUPSopción.
Para más opciones eche un vistazo al manual .

Adaephon
fuente
¿Cuál es el propósito de la pila de directorios además de mirarla a través de dirs?
Xerus
@ Xerus Permite volver a los directorios visitados anteriormente popdsin necesidad de escribir (o incluso saber) la ruta.
Adaephon