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?
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?
Respuestas:
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 $HOME
var o hacer dos cd
s. 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.
~
es hacer cd ~user/download
para ir al directorio de descarga de un usuario.
Hacer cd
es básicamente llamar cd
sin argumentos y de acuerdo con el cd
comportamiento "... 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 cd
comando, 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, HOME
se 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 cd
que hará una sola cosa, tilde se puede usar para realizar otras expansiones, como el ~+
directorio de trabajo actual.
Sin embargo, curiosamente podemos unset HOME
romper cd
pero ~
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 HOME
cadena vacía rompe tanto la tilde como el cd
comportamiento.
Tilde y $HOME
tiene algo de una diferencia y razón diferente para la existencia. $HOME
es 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, tilde
es 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 HOME
se ha respondido en esta pregunta : una vez el personaje tilde compartió la misma clave con HOME
el terminal Lear-Siegler ADM-3A. HOME
por 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 HOME
sea 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 echo
muestra 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 HOME
sí 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 PWD
y HOME
permanece 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
, dash
y csh
- todos se comportan igual con cd
o 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.
Independientemente de si usted está varios niveles de carpetas encima o por debajo $HOME
, los comandos cd
y 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 $HOME
al escribir un cd
comando. 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
~ 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.
root
El directorio de inicio de Eg , por lo general, está afuera/home
cd ~
vscd $HOME
vscd ~not-tandu
. Esta pregunta tiene que vercd
vscd ~
.