$HOME
e di ~
solito si riferiscono alla stessa cosa. Cioè, sono il percorso della directory "home" dell'utente che è nella forma generale "/ home / userName".
Quando, se mai, questi non fanno riferimento alla stessa directory?
$HOME
e di ~
solito si riferiscono alla stessa cosa. Cioè, sono il percorso della directory "home" dell'utente che è nella forma generale "/ home / userName".
Quando, se mai, questi non fanno riferimento alla stessa directory?
Risposte:
Entrambi $HOME
e ~
puntano alla stessa cartella, la cartella principale dell'utente corrente, ma entrambi sono cose molto diverse.
$HOME
è una variabile di ambiente , impostata per contenere la cartella principale dell'utente corrente.~
è un simbolo di espansione della shell , ovvero uno dei simboli che viene elaborato prima dell'esecuzione del comando effettivo. ~
da solo si espande al valore di $ HOME. ~nemo
si espande nella home directory dell'utente nemo
. Un simbolo di espansione della shell è un carattere (o una coppia di caratteri) che viene elaborato / interpretato dalla shell per creare il comando effettivo. Un altro esempio di simbolo di espansione della shell è *
, che viene utilizzato per espandere i nomi dei file.~
si espande in $ HOME o% APPDATA% su Windows. Se non sono definiti, cercherà il percorso nel "database delle password" (che di solito significa /etc/passwd
, ma potrebbe essere LDAP o qualche altra fonte di dati). Circa 20 anni fa avresti potuto essere avvisato che $ HOME non poteva essere impostato su alcune macchine, mentre ~
era garantito che si espandesse a qualcosa.
~
espande a $HOME
(uguale a $HOMEPATH
), no $APPDATA
. E su cmd.exe, ~
non si espande.
HOME
è una variabile d'ambiente (un concetto di sistema operativo, ad esempio in shell sh impostato con export
o declare -x
), non una variabile shell (la cui definizione dipende interamente dalla shell, ma in shell sh è di solito impostata con foo=value
o con set
o in pochi altri modi).
Un modo in cui differiscono è il modo in cui la shell Bash li converte quando racchiusa tra le "
virgolette.
Se si utilizza echo
in questo modo, senza le virgolette, poi ~
e $HOME
hanno lo stesso effetto:
$ echo ~
/home/elias
$ echo $HOME
/home/elias
Tuttavia, con le "
virgolette intorno, il risultato differisce:
$ echo "~"
~
$ echo "$HOME"
/home/elias
~
si espande solo come parte di un prefisso tilde che per definizione deve iniziare all'inizio della parola. Inoltre, poiché una volta faceva parte di schemi di globbing, ~
non funzionerà tra virgolette doppie. Quindi, "~"
o a~b
risulterà in un valore letterale di ~
essere preservato.
Un singolo ~
(o un ~
seguito da un /
) si espanderà alla casa dell'utente corrente:
$ echo ~/.ssh
/home/user/.ssh
A ~
seguito da un nome utente si espanderà nella cartella principale dell'utente:
$ echo ~root/.ssh
/root/.ssh
A ~
seguito da a +
o a -
e un numero opzionale si espandono agli elementi dello stack di directory :
$ cd /etc
$ echo ~+0
/etc
$HOME
è l'equivalente di un singolo ~
, che segue invece le regole di sintassi per le variabili. Ad esempio, si espande all'interno di virgolette doppie, può essere non impostato e gli operandi di manipolazione di stringhe possono essere applicati ad esso.
Questo dipende molto da cosa fa l'espansione. In bash, ~
è un modo conveniente per ottenere la home directory senza innescare l'espansione del nome o la divisione delle parole anche se non quotata. Per esempio:
$ 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|
Quindi, se stai lottando con le virgolette per qualche motivo (nel qual caso dovresti davvero ripensare il tutto, è più facile lottare con i maiali), ~
potrebbe essere più conveniente.
Altrove, in Python, per esempio, ~
e $HOME
devono essere espansi con diverse funzioni . Alcuni altri posti consentono variabili e non consentono altre sintassi della shell come caratteri jolly o espansione tilde (ad esempio ~/.pam_environment
, che ha una sintassi speciale per l'espansione variabile). Tuttavia, altri posti consentono l'espansione della tilde come eccezione (ad esempio, systemd ), ma interroga direttamente il database passwd invece di utilizzarlo $HOME
.
$HOME
, ma non puoi (direttamente) cambiare il valore di ~
.
$HOME
e ~
non si riferiscono alla stessa cosa - normalmente lo fanno di default - e quindi si assegna deliberatamente alla variabile d'ambiente per fare in modo che non si riferiscano alla stessa cosa. Questa è una buona dimostrazione ma inutilmente confusa.
$ HOME / ha maggiori probabilità di funzionare con POSIX.2 Bourne / bin / sh standard poiché l'espansione tilde è un'estensione trovata in BSD csh tcsh GNU bash e altri.
Se vuoi scrivere script portatili su busybox o dash o BSD sh, investi nelle lettere extra per non andare in crash con ~ /: nessun file o directory di questo tipo su determinati sistemi.
Trovo anche $ HOME / più leggibile.
$HOME
e usano raramente ~
. Il mio ex sé probabilmente lo sapeva.
~
shell dipende mentre $ HOME non lo è.