Diferencia entre "cd -" y "cd ~-"

Diferencia entre "cd -" y "cd ~-"

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 cdsecció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 cdincorporado. 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 cdve es directamente el nombre del directorio anterior. -El shell no lo expande, cdlo 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 elcddominio:

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á $OLDPWDantes de que se ejecute cualquier comando y se puede pasar como argumento para cualquier comando, no solo cd. Es una extensión posterior eny.

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 $HOMEsi [name]es la cadena vacía o al directorio de inicio del usuario namesi namees un nombre de usuario válido.

información relacionada