Differenza tra $ HOME e ~


Risposte:


45

Entrambi $HOMEe ~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. ~nemosi 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.

1
~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.
Mirek Długosz,

Questa differenza si nota in programmi come make, quando devi sapere quale dei due hai bisogno
D. Ben Knoble

3
@ MirekDługosz Almeno su git bash su Windows, si ~espande a $HOME(uguale a $HOMEPATH), no $APPDATA. E su cmd.exe, ~non si espande.
hyde,

1
@vanadium HOMEè una variabile d'ambiente (un concetto di sistema operativo, ad esempio in shell sh impostato con exporto declare -x), non una variabile shell (la cui definizione dipende interamente dalla shell, ma in shell sh è di solito impostata con foo=valueo con seto in pochi altri modi).
hyde,

1
@hyde l'ho espresso in modo sbagliato. bash controllerà $ HOME, se non è impostato controllerà% APPDATA%, ma solo su Windows; se non è impostato, cercherà "il database delle password". Vedi git.savannah.gnu.org/cgit/bash.git/tree/lib/readline/…
Mirek Długosz,

17

Un modo in cui differiscono è il modo in cui la shell Bash li converte quando racchiusa tra le "virgolette.

Se si utilizza echoin questo modo, senza le virgolette, poi ~e $HOMEhanno lo stesso effetto:

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

Tuttavia, con le "virgolette intorno, il risultato differisce:

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

13

~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~brisulterà 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.


3

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 $HOMEdevono 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.


Un'altra grande differenza, che mostri qui, ma non menzioni, è che puoi cambiare il valore di $HOME, ma non puoi (direttamente) cambiare il valore di ~.
Joe,

Quindi ho chiesto quando si fa $HOMEe ~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.
H2ONaCl

1

$ 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.


In uno script la leggibilità e la visibilità sono importanti. Forse è per questo che i miei script usano $HOMEe usano raramente ~. Il mio ex sé probabilmente lo sapeva.
H2ONaCl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.