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

Pregunta:

¿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 se hace cd) mientras que en bash cd no afecta la pila de directorios.

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

Respuesta:

Depende. En zsh puede configurar cd para insertar el directorio antiguo en la pila de directorios automáticamente, pero no es la configuración predeterminada.

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

  • cd somedir
    • cambiar directorio a somedir
    • guardar el directorio original en OLDPWD
    • set PWD="somedir"
    • reemplace el elemento superior de la pila de directorios (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 PWD y OLDPWD
    • modificar el elemento superior de la pila de directorios para reflejar (el nuevo) PWD
  • pushd somedir :
    • cambiar directorio a somedir
    • guardar directorio original en OLDPWD
    • set PWD="somedir"
    • empujar somedir en la pila de directorios (extendiéndolo en un elemento)
  • popd :
    • guardar 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 PWD en 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 zsh y bash . bash como referencia para las listas anteriores.

  • En bash el directorio de trabajo actual se considera el elemento superior de la pila de directorios. El man 1 bash dice:

    pushd [-n] [dir]

    […] Agrega dir a la pila de directorios en la parte superior, convirtiéndolo en el nuevo directorio de trabajo actual como si se hubiera proporcionado como argumento para el cd incorporado. […]

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

  • En zsh el directorio de trabajo actual no es parte de la pila de directorios (pero aún se muestra con dirs ). man 1 zshbuiltins dice:

    pushd [ -qsLP ] [ arg ]

    […] Cambie el directorio actual y empuje el antiguo directorio actual a la pila de directorios. En el primer formulario, cambie el directorio actual a arg. […]

    Imprimir dirstack ( echo ${dirstack[@]} ) y compararlo con la salida de dirs debería mostrar que el PWD no es parte de `dirstack.

En ambos shells, dirs imprime el directorio de trabajo actual como primer elemento. También en ambos shells, el elemento de pila de directorio con el índice 1 refiere al directorio que estaba actual antes de la última pushd . Esto se debe a que las matrices en zsh generalmente se numeran desde 1 , mientras que en bash se numeran desde 0 . Entonces hay poca diferencia práctica


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

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

Pero esto no modifica cd - para que se comporte como popd . En su lugar, simplemente inserta $PWD en la pila de directorios y cambia el directorio a $OLDPWD . Eso significa llamar repetidamente a cd - hecho, aumentará la pila de directorios ( ($PWD $OLDPWD $PWD $OLDPWD $PWD …) ). Si realmente se comporta exactamente como popd en su sistema, sugeriría si cd es realmente el incorporado (de whence -v cd ); es posible que sea reemplazado por un alias o una función.

Como la pila de directorios crecerá bastante rápido con AUTO_PUSHD habilitado, puede limitar su tamaño configurando el parámetro DIRSTACKSIZE al tamaño máximo deseado.
También puede evitar duplicados configurando la opción PUSHD_IGNORE_DUPS .
Para obtener más opciones, consulteel manual .

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım