Hay dos cosas en juego aquí. Primero, el -
solo se expande a su directorio anterior. Esto se explica en la cd
sección de man bash
(énfasis mío):
Un argumento de -
se convierte a $ OLDPWD antes de intentar el cambio de directorio. Si se utiliza un nombre de directorio no vacío de CDPATH, o si -
es el primer argumento, y el cambio de directorio es exitoso, el nombre de ruta absoluto del nuevo directorio de trabajo se escribe en la salida estándar. El valor de retorno es verdadero si el directorio se cambió con éxito; falso de lo contrario.
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":
Si el prefijo tilde es a ~+
, el valor de la variable de shell PWD reemplaza el prefijo tilde. Si el prefijo tilde es a ~-
, el valor de la variable de shell OLDPWD, si está configurado, se sustituye. Si los caracteres que siguen a la tilde en el prefijo de tilde consisten en un número N, opcionalmente con el prefijo a +
o a -
, el prefijo de tilde se reemplaza con el elemento correspondiente de la pila de directorios, como lo mostrarían los directorios incorporados con el prefijo tilde como argumento. Si los caracteres que siguen a la tilde en el prefijo tilde consisten en un número sin un signo inicial +
o -
, +
se supone.
Esto podría ser más fácil de entender con un ejemplo:
$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~ ## prints $HOME
/home/terdon
$ echo ~+ ## prints $PWD
/etc
$ echo ~- ## prints $OLDPWD
/home/terdon/foo
Entonces, en general, -
significa "el directorio anterior". Es cd -
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 la cd
construcción. Si lo intentas echo -
, 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 puedes echo ~-
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"/* .
cd ~-
.