So che probabilmente è stato chiesto prima, ma non sono riuscito a trovarlo con Google.
Dato
- Kernel Linux
- Nessuna configurazione che cambia $HOME
- bash
~ == $HOME essere vero?
Risposta accettata:
Ciò che è importante capire è che ~ l'espansione è una caratteristica della shell (di alcune shell), non è un personaggio magico che indica la tua home directory ovunque venga utilizzata.
Viene espanso (dalla shell, che è un'applicazione usata per interpretare le righe di comando), come $var viene espanso al suo valore in alcune condizioni quando viene utilizzato in una riga di comando della shell prima dell'esecuzione del comando.
Quella caratteristica è apparsa per la prima volta nella shell C alla fine degli anni '70 (la shell Bourne non la aveva, né il suo predecessore la shell Thompson), è stata successivamente aggiunta alla shell Korn (una shell più recente costruita sulla shell Bourne nel anni 80). Alla fine è stato standardizzato da POSIX ed è ora disponibile nella maggior parte delle conchiglie, comprese quelle non POSIX come fish .
Poiché è così diffuso nelle shell, alcune applicazioni non shell lo riconoscono anche come directory home. È il caso di molte applicazioni nei loro file di configurazione o nei loro propri riga di comando (mutt , slrn , vim …).
bash in particolare (che è la shell del progetto GNU e ampiamente utilizzata in molti sistemi operativi basati su Linux), quando viene invocata come sh , segue principalmente le regole POSIX su ~ espansione, e nelle aree non specificate da POSIX, si comporta principalmente come la shell Korn (di cui è una parte clone).
Mentre $var è espanso nella maggior parte dei punti (tranne all'interno di virgolette singole), ~ espansione, essendo un ripensamento si espande solo in alcune condizioni specifiche.
Viene espanso quando si trova sul proprio argomento in contesti di elenco, in contesti in cui è prevista una stringa.
Ecco alcuni esempi di dove è espanso in bash :
cmd arg ~ other argvar=~var=x:~:x(richiesto da POSIX, usato per variabili comePATH,MANPATH…)for i in ~[[ ~ = text ]][[ text = ~ ]](l'espansione di~preso come modello in AT&Tkshma nonbashdalla 4.0).case ~ in ~) ...${var#~}(sebbene non in alcune altre shell)cmd foo=~(sebbene non quando invocato comeshe solo quando cosa c'è a sinistra di=ha la forma di unbashsenza virgolette nome variabile)cmd ~/x(richiesto da POSIX ovviamente)cmd ~:x(ma nonx:~:xox-~-x)a[~]=foo; echo "${a[~]} $((a[~]))"(non in alcune altre shell)
Ecco alcuni esempi in cui non è espanso:
echo "~" '~'echo [email protected] ~~(nota anche che~uha lo scopo di espandersi nella directory home dell'utenteu).echo @~(( HOME == ~ )),$(( var + ~ ))- con
extglob:case $var in @(~|other))...(sebbenecase $var in ~|other)va bene). ./configure --prefix=~(come--prefixnon è un nome di variabile valido)cmd "foo"=~(inbash, a causa delle virgolette).- quando invocato come
sh:export "foo"=~,env JAVA_HOME=~ cmd…
Per quanto riguarda a cosa si espande:~ da solo si espande al contenuto della HOME variabile, o quando non è impostata, nella home directory dell'utente corrente nel database dell'account (come estensione poiché POSIX lascia quel comportamento indefinito).
Va notato che in ksh88 e bash versioni precedenti alla 4.0, l'espansione di tilde è stata sottoposta a globbing (generazione di nomi di file) in contesti di elenco:
$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~
Questo non dovrebbe essere un problema nei casi normali.
Tieni presente che, poiché è espanso, lo stesso avviso si applica alle altre forme di espansione.
cd ~
Non funziona se $HOME inizia con - o contiene .. componenti. Quindi, anche se è molto improbabile che faccia mai la differenza, a rigor di termini, si dovrebbe scrivere:
cd -P -- ~
O anche:
case ~ in
(/*) cd -P ~;;
(*) d=~; cd -P "./$d";;
esac
(per coprire i valori di $HOME come - , +2 …) o semplicemente:
cd
(come cd ti porta alla tua home directory senza alcun argomento)
Altre shell hanno ~ più avanzati espansioni. Ad esempio, in zsh , abbiamo:
~4,~-,~-2(con completamento) utilizzato per espandere le directory nel tuo stack di directory (le posizioni in cui haicda prima).- directory denominate dinamiche . Puoi definire il tuo meccanismo per decidere come
~somethingviene ampliato.