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 arg
var=~
var=x:~:x
(richiesto da POSIX, usato per variabili comePATH
,MANPATH
…)for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
(l'espansione di~
preso come modello in AT&Tksh
ma nonbash
dalla 4.0).case ~ in ~) ...
${var#~}
(sebbene non in alcune altre shell)cmd foo=~
(sebbene non quando invocato comesh
e solo quando cosa c'è a sinistra di=
ha la forma di unbash
senza virgolette nome variabile)cmd ~/x
(richiesto da POSIX ovviamente)cmd ~:x
(ma nonx:~:x
ox-~-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~u
ha 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--prefix
non è 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 haicd
a prima).- directory denominate dinamiche . Puoi definire il tuo meccanismo per decidere come
~something
viene ampliato.