Diferencia entre $ HOME y ~


Respuestas:


45

Tanto $HOMEy ~apuntan a la misma carpeta, la carpeta de inicio del usuario actual, pero ambos son cosas muy diferentes.

  • $HOMEes una variable de entorno , que está configurada para contener la carpeta de inicio del usuario actual.
  • ~es un símbolo de expansión de shell , es decir, uno de los símbolos que se procesa antes de ejecutar el comando real. ~solo se expande al valor de $ HOME. ~nemose expande al directorio de inicio del usuario nemo. Un símbolo de expansión de shell es un carácter (o par de caracteres) que es procesado / interpretado por el shell para construir el comando real. Otro ejemplo de un símbolo de expansión de shell es *, que se utiliza para expandir nombres de archivos.

1
~se expande a $ HOME o% APPDATA% en Windows. Si no están definidos, buscará la ruta en "la base de datos de contraseñas" (que generalmente significa /etc/passwd, pero podría ser LDAP o alguna otra fuente de datos). Hace unos 20 años, se le podría haber advertido que $ HOME podría no estar configurado en algunas máquinas, mientras que ~se garantizó que se expandiría a algo.
Mirek Długosz

Esta diferencia es notable en programas como make, cuando necesitas saber cuál de los dos necesitas
D. Ben Knoble

3
@ MirekDługosz Al menos en git bash en Windows, se ~expande a $HOME(igual a $HOMEPATH), no $APPDATA. Y en cmd.exe, ~no se expande.
hyde

1
@vanadium HOMEes una variable de entorno (un concepto de sistema operativo, en shells sh , por ejemplo, configurado con exporto declare -x), no una variable de shell (la definición de la cual depende completamente de shell, pero en shells sh generalmente se establece con foo=valueo con seto en algunos otros formas).
hyde

1
@hyde lo expresé mal. bash verificará $ HOME, si no está configurado, verificará% APPDATA%, pero solo en Windows; si no está configurado, buscará "la base de datos de contraseñas". Ver git.savannah.gnu.org/cgit/bash.git/tree/lib/readline/…
Mirek Długosz

17

Una forma en que difieren es en cómo el shell Bash los convierte cuando se incluyen "entre comillas.

Si usa echoasí, sin comillas, entonces ~y $HOMEtenga el mismo efecto:

$ echo ~
/home/elias
$ echo $HOME
/home/elias

Sin embargo, con "comillas alrededor de ellos, el resultado difiere:

$ echo "~"
~
$ echo "$HOME"
/home/elias

13

~solo se expande como parte de un prefijo tilde que, por definición, debe comenzar al comienzo de la palabra. Además, como alguna vez fue parte de los patrones globales, ~no funcionará entre comillas dobles. Entonces, "~"o a~bdará como resultado un valor literal de ~ser preservado.

Un solo ~(o ~seguido de a /) se expandirá a la casa del usuario actual:

$ echo ~/.ssh
/home/user/.ssh

A ~seguido de un nombre de usuario se expandirá a la carpeta de inicio de ese usuario:

$ echo ~root/.ssh
/root/.ssh

A ~seguido de a +o a -y un número opcional se expandirán a elementos de la pila de directorios :

$ cd /etc
$ echo ~+0
/etc

$HOMEes el equivalente de un solo ~, que en su lugar sigue las reglas de sintaxis para las variables Por ejemplo, se expande entre comillas dobles, se puede desarmar y se le pueden aplicar operandos de manipulación de cadenas .


3

Esto depende mucho de lo que hace la expansión. En bash, ~es una forma conveniente de obtener el directorio de inicio sin activar la expansión del nombre de archivo o la división de palabras, aunque no esté entre comillas. Por ejemplo:

$ HOME='/*'
$ echo $HOME
/bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
$ echo ~
/*

O:

$ HOME='/ a b'
$ printf "|%s|\n" $HOME ~
|/|
|a|
|b|
|/ a b|

Entonces, si estás luchando con citas por alguna razón (en cuyo caso realmente deberías repensar todo el asunto, es más fácil luchar con los cerdos), ~podría ser más conveniente.


En otros lugares, en Python, por ejemplo, ~y $HOMEtienen que ampliarse con diferentes funciones . Algunos otros lugares permiten variables y no permiten otra sintaxis de shell como comodines o expansión de tilde (por ejemplo ~/.pam_environment, que tiene una sintaxis especial para la expansión de variables). Sin embargo, otros lugares permiten la expansión de tilde como una excepción (por ejemplo, systemd ), pero consultan la base de datos passwd directamente en lugar de usar $HOME.


Otra gran diferencia, que muestra aquí, pero no menciona, es que puede cambiar el valor de $HOME, pero no puede (directamente) cambiar el valor de ~.
Joe

Entonces, pregunté cuándo hacer $HOMEy ~no referirse a lo mismo, normalmente lo hacen de manera predeterminada, y luego se asigna deliberadamente a la variable de entorno para que no se refieran a lo mismo. Esta es una buena demostración pero innecesariamente confusa.
H2ONaCl

1

$ HOME / es más probable que funcione en POSIX.2 estándar Bourne / bin / sh ya que la expansión tilde es una extensión que se encuentra en BSD csh tcsh GNU bash y otros.

Si desea escribir scripts portátiles en busybox o dash o BSD sh, invierta en las letras adicionales para que no se bloquee con ~ /: No existe dicho archivo o directorio en ciertos sistemas.

También encuentro $ HOME / más legible.


En un script, la legibilidad y la visibilidad son importantes. Quizás es por eso que mis scripts usan $HOMEy rara vez usan ~. Mi antiguo yo probablemente lo sabía.
H2ONaCl
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.