El comando Bash
cd -
imprime el directorio utilizado anteriormente y lo modifica.
Por otro lado, el comando Bash
cd ~-
cambia directamente al directorio utilizado anteriormente, sin hacer eco de nada.
¿Es esa la única diferencia? ¿Cuál es el caso de uso de cada uno de los comandos?
bash
directory
cd-command
pushd
dr01
fuente
fuente
cd ~-
.Respuestas:
Hay dos cosas en juego aquí. Primero, el
-
solo se expande a su directorio anterior. Esto se explica en lacd
sección deman bash
(énfasis mío):Entonces, un simple
cd -
lo moverá de regreso a su directorio anterior e imprimirá el nombre del directorio. El otro comando está documentado en la sección "Expansión de Tilde":Esto podría ser más fácil de entender con un ejemplo:
Entonces, en general,
-
significa "el directorio anterior". Escd -
por eso que por sí solo lo llevará de regreso a donde sea que esté.La principal diferencia es que
cd -
es específica de lacd
construcción. Si lo intentasecho -
, solo imprimirá a-
. El~-
es parte de la funcionalidad de expansión tilde y se comporta de manera similar a una variable. Es por eso que puedesecho ~-
y obtienes algo significativo. También puede usarlo,cd ~-
pero podría usarlo en cualquier otro comando. Por ejemplo,cp ~-/* .
que sería equivalente acp "$OLDPWD"/* .
fuente
set -x
imprimir el comando expandido antes de ejecutarlo puede ser útil para ilustrar la diferencia (o puede ser indescifrablemente ruidoso cuando no lo está haciendo usted mismo paso a paso).cd ~-/..
funciona,cd -/..
no lo hace!~-
está sujeto a la expansión de tilde (ver man bash), entonces lo quecd
ve es el nombre del directorio anterior directamente.-
el shell no lo expande, locd
ve directamente y se comporta como se documenta:fuente
TL; DR:
cd -
está integradocd
,~-
es una extensión posterior de~[name]
, no específico decd
.POSIX.1-2008 Shell & Utilities se define
cd -
como un caso especial que es específico para elcd
comando :La
~-
extensión se expandirá$OLDPWD
antes de que se ejecute cualquier comando y se puede pasar como argumento para cualquier comando, no solocd
. Es una extensión posterior en ksh y bash .El estándar POSIX.1-2008 Shell & Utilities mencionado anteriormente también tiene una explicación detallada de la expansión de Tilde . La redacción es muy específica para permitir
~-
un comportamiento indefinido dentro del alcance del estándar, donde se~[name]
refiere a$HOME
si[name]
es la cadena vacía o al directorio de inicio del usuarioname
siname
es un nombre de usuario válido.fuente