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
) consomedir
(el número de elementos en la pila no cambia).
- cambiar directorio a
-
cd -
:- cambiar directorio a
$OLDPWD
- intercambiar valores de
PWD
yOLDPWD
- modificar el elemento superior de la pila de directorios para reflejar (el nuevo)
PWD
- cambiar directorio a
-
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)
- cambiar directorio a
-
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
- guardar directorio original en
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. Elman 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 elcd
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 condirs
).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 dedirs
debería mostrar que elPWD
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 .