Parece que ~ y $ HOME son equivalentes en la línea de comandos y los scripts de shell. ¿Es eso cierto?
Parece que ~ y $ HOME son equivalentes en la línea de comandos y los scripts de shell. ¿Es eso cierto?
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.
$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.
Lea otras preguntas en las etiquetas macos command-line