Diferencia entre 'cd' y 'cd ~'

10

Me pregunto, si solo el CD me envía a mi carpeta de inicio y el CD ~ hace lo mismo, ¿por qué se agregó el ~ en primer lugar entonces?

¿Es algo específico de BASH o se comportarían de manera diferente en otro Shell?

Luis Alvarado
fuente
2
Definitivamente no es un duplicado. Esa pregunta tiene que ver cd ~vs cd $HOMEvs cd ~not-tandu. Esta pregunta tiene que ver cdvs cd ~.

Respuestas:

17

Se ~puede usar para algo más que eso. Cualquier comando puede beneficiarse de tener un acceso directo a la carpeta de inicio. Por lo tanto, no es necesario si desea cd en su hogar, pero ¿qué pasa ~/.config?

$ cd ~/.config

De lo contrario, tendría que escribir la ruta de inicio, usar la $HOMEvar o hacer dos cds. También para copiar o mover archivos:

$ cp ~/downloads/some-file some/path/

Como la mayoría de sus archivos están en el hogar, siempre es bueno tener un acceso directo.

ahilsend
fuente
Hola ahilsend, en realidad mi pregunta está más orientada a por qué las 2 formas. Ya sé sobre ~ usar la variable $ HOME pero, teniendo esto en cuenta, ¿por qué "CD" solo también me envía a casa? ¿Por qué 2 formas para el mismo propósito?
Luis Alvarado
44
@CYREX Mi conjetura sería guardar la escritura para el caso muy común de querer moverse a su directorio de inicio.
un CVn
1
El otro uso del ~es hacer cd ~user/downloadpara ir al directorio de descarga de un usuario.
ott--
5

Hacer cd es básicamente llamar cdsin argumentos y de acuerdo con el cdcomportamiento "... si no se proporciona dir, el valor de la variable de shell HOME es el predeterminado". (del manual bash ). Por el contrario, cd ~es cuando proporciona un argumento para el cdcomando, que es ~y shell realizará una expansión de tilde . En cuanto a volver al directorio de inicio del usuario, no hay diferencia. En cualquier caso, HOMEse consultará la variable de entorno:

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

Efectivamente, esto tampoco tiene diferencia de cd $HOME. Sin embargo, mientras cdque hará una sola cosa, tilde se puede usar para realizar otras expansiones, como el ~+directorio de trabajo actual.

Sin embargo, curiosamente podemos unset HOMEromper cdpero ~aún funcionará:

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

Por qué ? Nuevamente, responda en el manual:

Si HOME no está configurado, el directorio de inicio del usuario que ejecuta el shell se sustituye en su lugar. De lo contrario, el prefijo tilde se reemplaza con el directorio de inicio asociado con el nombre de inicio de sesión especificado.

Tenga en cuenta que desarmar es diferente a hacer una variable vacía HOME=y tiene efecto. La documentación habla específicamente sobre la variable de desarmado. Hacer que la variable sea igual a una cadena vacía tiene un efecto opuesto al que esperaríamos:

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

Aquí puede ver que hacer una HOMEcadena vacía rompe tanto la tilde como el cdcomportamiento.


Tilde y $HOMEtiene algo de una diferencia y razón diferente para la existencia. $HOMEes una variable de shell, que casualmente también es una de las variables de entorno, y que está disponible para todos los programas; en C usarías environ()para acceder a eso. Por el contrario, tildees una sintaxis específica de shell que realiza la expansión de tilde, aunque también puede usar la wordexp()función para realizar una expansión ( referencia ) similar a shell en C.

La razón por la cual ~representa HOMEse ha respondido en esta pregunta : una vez el personaje tilde compartió la misma clave con HOMEel terminal Lear-Siegler ADM-3A. HOMEpor el contrario, es una variable de entorno que tenía un significado puramente simbólico y no tenía representaciones físicas.

Además, el hecho de que HOMEsea ​​una variable de entorno nos permite desarmarla, ya que no podemos establecer ~otra cosa por medios simples.

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

Observe la línea en blanco donde primero se echomuestra la variable no establecida, y el hecho de que. Por el contrario, no podemos hacer cosas como esta para tilde:

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

Sin embargo, la alteración HOMEsí afecta ~:

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

Además, como ~también funciona como personaje de expansión, podemos hacer cosas como esta para mostrar el directorio de trabajo actual:

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

Mientras que si queremos hacer eso a través de variables de entorno, necesitamos PWDy HOMEpermanece igual, o si haces cosas como echo $HOME+eso, eso es simplemente concatenación de cadenas / variables. Pero nuevamente, ~+saca información de las variables de entorno:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

NOTA : las expansiones ~+y ~-funcionan en ksh, pero no en dash.


Para responder algunas de sus preguntas específicas:

¿Es algo específico de BASH o se comportarían de manera diferente en otro Shell?

No, esto debería ser un comportamiento consistente. ksh, dashy csh- todos se comportan igual con cdo cd ~.

¿por qué se agregó el ~ en primer lugar entonces?

Diría conveniencia y razones históricas como se explica en la respuesta vinculada sobre tilde. Finalmente, creció para realizar más que solo la expansión del directorio de inicio.

Sergiy Kolodyazhnyy
fuente
0

Independientemente de si usted está varios niveles de carpetas encima o por debajo $HOME, los comandos cdy cd ~hacer lo mismo, y no difieren - se le enviará de vuelta a su directorio personal.

SIN EMBARGO: cuando tiene 1 o más niveles de carpeta por encima de INICIO y desea ir DIRECTAMENTE a un subdirectorio 1 o más niveles de carpeta a continuación $HOME, tilde ( ~) es útil al guardar las pulsaciones de teclas cuando se usa para sustituir el texto necesario para referirse a $HOMEal escribir un cdcomando. Por ejemplo;

/$ cd    # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3    # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
P Alexander
fuente
0

~ significa / home / nombre de usuario, por lo que ahorra algo de tiempo al escribir. Por ejemplo, cd / home / username / Downloads es lo mismo que cd ~ / Downloads, pero escribe menos. Ambos comandos hacen lo mismo, cambian el directorio de trabajo a esa ubicación.

Ionut
fuente
Realmente no. rootEl directorio de inicio de Eg , por lo general, está afuera/home
Dmitry Grigoryev