¿Hay alguna diferencia entre ~ y $ HOME?

7

Parece que ~ y $ HOME son equivalentes en la línea de comandos y los scripts de shell. ¿Es eso cierto?

    
pregunta tomcam 01.10.2016 - 02:54

2 respuestas

10

Es cierto hasta cierto punto.

  • $HOME es una expresión para la expansión de la variable de entorno HOME
  • ~ (tilde) es un componente de expansión de shell separado ver nota al pie

Cuando se usa como un argumento de comando y en la separación de otras cadenas, $HOME y ~ son generalmente equivalentes.

Pero hay casos en que difieren:

  • si la cadena que contiene cualquiera de las dos está citada, por ejemplo:

    # echo "My home directory is $HOME"
    My home directory is /Users/techraf
    # echo "My home directory is ~"
    My home directory is ~
    
  • si están concatenadas a una cadena, por ejemplo:

    • dd if=${HOME}/source_file of=${HOME}/destination_file funcionará.

      El Shell pasará los argumentos if=/Users/techraf/source_file y of=/Users/techraf/destination_file que contienen una ruta válida al comando dd .

    • dd if=~/source_file of=~/destination_file no funcionará

      Shell pasará los argumentos if=~/source_file y of=~/destination_file al comando dd e informará de un error ya que no interpreta ~ .

footnote:

De hecho, ~ se reemplaza por defecto con el valor de HOME , pero si HOME está vacío, se resuelve en un directorio principal:

# echo $HOME
/Users/techraf
# export HOME=/dummy
# echo $HOME
/dummy
# echo ~
/dummy

# unset HOME
# echo $HOME

# echo ~
/Users/techraf

Desde man bash :

  

Expansión de tilde

     

Si una palabra comienza con un carácter de tilde sin comillas ('~'), todos los caracteres que preceden a la primera barra sin comillas (o todos los caracteres, si no hay una barra sin comillas) se consideran un prefijo de tilde. Si no se cita ninguno de los caracteres en el prefijo de tilde, los caracteres en el prefijo de tilde después de la tilde se tratan como un posible nombre de inicio de sesión. Si este nombre de inicio de sesión es una cadena nula, la tilde se reemplaza con el valor del parámetro de shell HOME.

     

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

    
respondido por el techraf 01.10.2016 - 03:02
0

$HOME está disponible en las primeras etapas de inicio de sesión cuando ~ no está disponible. El motivo es que $HOME está definido por el entorno del sistema y ~ es un acceso directo de shell. Es por eso que se prefiere $HOME para shell scripting.

    
respondido por el A B 01.10.2016 - 03:03

Lea otras preguntas en las etiquetas