Sembrerebbe che ~ e $ HOME siano equivalenti nella riga di comando e negli script di shell. È vero?
È vero fino a un certo punto.
$HOME
è un'espressione per l'espansione della variabile d'ambiente HOME
~
(tilde) è un componente di espansione della shell separato
vedi nota
Se usato come argomento di comando e in separazione da altre stringhe, $HOME
e ~
sono generalmente equivalenti.
Ma ci sono casi in cui differiscono:
se la stringa che contiene è quotata, ad esempio:
# echo "My home directory is $HOME"
My home directory is /Users/techraf
# echo "My home directory is ~"
My home directory is ~
se sono concatenati a una stringa, ad esempio:
dd if=${HOME}/source_file of=${HOME}/destination_file
funzionerà.
Shell passerà gli argomenti if=/Users/techraf/source_file
e of=/Users/techraf/destination_file
contenenti un percorso valido al comando dd
.
dd if=~/source_file of=~/destination_file
non funzionerà
Shell passerà gli argomenti if=~/source_file
e of=~/destination_file
al comando dd
e segnalerà un errore poiché non interpreta ~
.
nota:
In effetti ~
è sostituito per impostazione predefinita con il valore di HOME
, ma se HOME
è vuoto, viene risolto in una directory home:
# echo $HOME
/Users/techraf
# export HOME=/dummy
# echo $HOME
/dummy
# echo ~
/dummy
# unset HOME
# echo $HOME
# echo ~
/Users/techraf
Da man bash
:
Tilde Expansion
If a word begins with an unquoted tilde character ('~'), all of the characters preceding the first unquoted slash (or all characters, if there is no unquoted slash) are considered a tilde-prefix. If none of the characters in the tilde-prefix are quoted, the characters in the tilde-prefix following the tilde are treated as a possible login name. If this login name is the null string, the tilde is replaced with the value of the shell parameter HOME.
If HOME is unset, the home directory of the user executing the shell is substituted instead. Otherwise, the tilde-prefix is replaced with the home directory associated with the specified login name.
$HOME
è disponibile nelle fasi iniziali di accesso quando ~
non è disponibile. Il motivo è che $HOME
è definito dall'ambiente di sistema e ~
è una scorciatoia da shell. Ecco perché $HOME
è preferito per lo scripting di shell.
Leggi altre domande sui tag command-line macos