
El comando bash
cd -
imprime el directorio utilizado anteriormente y lo cambia.
Por otro lado, el comando Bash
cd ~-
cambia directamente al directorio utilizado anteriormente, sin repetir nada.
¿Es esa la única diferencia? ¿Cuál es el caso de uso para cada uno de los comandos?
Respuesta1
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
(el énfasis es 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 se realiza correctamente, la ruta absoluta del nuevo directorio de trabajo se escribe en la salida estándar. El valor de retorno es verdadero si el directorio se cambió correctamente; falso en caso contrario.
Entonces, un simple cd -
lo llevará 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 de tilde es a
~+
, el valor de la variable de shell PWD reemplaza el prefijo de tilde. Si el prefijo de tilde es a~-
, se sustituye el valor de la variable de shell OLDPWD, si está configurado. Si los caracteres que siguen a la tilde en el prefijo de tilde constan de 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, tal como lo mostrarían los directorios integrados invocados con el prefijo de tilde como argumento. Si los caracteres que siguen a la tilde en el prefijo de tilde constan de un número sin+
o inicial-
,+
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 por eso que cd -
por sí solo te hará regresar a donde estabas.
La principal diferencia es que cd -
es específica del cd
incorporado. Si lo intentas, echo -
simplemente imprimirá un archivo -
. Es ~-
parte de la funcionalidad de expansión de tilde y se comporta de manera similar a una variable. Por eso puedes echo ~-
conseguir algo significativo. También puedes usarlo en cd ~-
pero también puedes usarlo en cualquier otro comando. Por ejemplo cp ~-/* .
lo que equivaldría acp "$OLDPWD"/* .
Respuesta2
~-
está sujeto a expansión de tilde (ver man bash), por lo que lo que cd
ve es directamente el nombre del directorio anterior. -
El shell no lo expande, cd
lo ve directamente y se comporta como está documentado:
Un argumento de - es equivalente a $OLDPWD. Si se utiliza un nombre de directorio no vacío de CDPATH, o si - es el primer argumento y el cambio de directorio se realiza correctamente, la ruta absoluta del nuevo directorio de trabajo se escribe en la salida estándar.
Respuesta3
TL;DR: cd -
está integrado en cd
, ~-
es una extensión posterior de ~[name]
, no específico de cd
.
POSIX.1-2008 Shell y servicios públicosdefine cd -
como un caso especial que esespecíficoPara elcd
dominio:
Cuando
-
se utiliza a como operando, será equivalente al comando:
cd "$OLDPWD" && pwd
que cambia al directorio de trabajo anterior y luego escribe su nombre.
La ~-
extensión se expandirá $OLDPWD
antes de que se ejecute cualquier comando y se puede pasar como argumento para cualquier comando, no solo cd
. Es una extensión posterior enkshyintento.
El estándar POSIX.1-2008 Shell & Utilities antes mencionado también tieneuna 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 ~[name]
se refiere a $HOME
si [name]
es la cadena vacía o al directorio de inicio del usuario name
si name
es un nombre de usuario válido.