Je sais que cela a probablement déjà été demandé, mais je n'ai pas pu le trouver avec Google.
Donné
- Noyau Linux
- Aucune configuration ne modifie $HOME
- bash
Est-ce que ~ == $HOME
être vrai ?
Réponse acceptée :
Ce qu'il est important de comprendre, c'est que ~
l'expansion est une fonctionnalité du shell (de certains shells), ce n'est pas un caractère magique qui signifie votre répertoire personnel où qu'il soit utilisé.
Il est développé (par le shell, qui est une application utilisée pour interpréter les lignes de commande), comme $var
est étendu à sa valeur dans certaines conditions lorsqu'il est utilisé dans une ligne de commande shell avant l'exécution de la commande.
Cette fonctionnalité est apparue pour la première fois dans le C-shell à la fin des années 1970 (le shell Bourne ne l'avait pas, pas plus que son prédécesseur le shell Thompson), a ensuite été ajoutée au shell Korn (un nouveau shell construit sur le shell Bourne dans le années 80). Il a finalement été standardisé par POSIX et est maintenant disponible dans la plupart des shells, y compris ceux non POSIX comme fish
.
Parce qu'il est si largement utilisé dans les shells, certaines applications non-shell le reconnaissent également comme signifiant le répertoire personnel. C'est le cas de nombreuses applications dans leurs fichiers de configuration ou leur propre ligne de commande (mutt
, slrn
, vim
…).
bash
spécifiquement (qui est le shell du projet GNU et largement utilisé dans de nombreux systèmes d'exploitation basés sur Linux), lorsqu'il est appelé en tant que sh
, suit principalement les règles POSIX concernant ~
expansion, et dans les zones non spécifiées par POSIX, se comporte principalement comme le shell Korn (dont il est un clone partiel).
Tandis que $var
est développé dans la plupart des endroits (sauf à l'intérieur des guillemets simples), ~
l'expansion, étant une réflexion après coup, n'est étendue que dans quelques conditions spécifiques.
Il est développé lorsqu'il est sur son propre argument dans des contextes de liste, dans des contextes où une chaîne est attendue.
Voici quelques exemples où il est développé dans bash
:
cmd arg ~ other arg
var=~
var=x:~:x
(requis par POSIX, utilisé pour des variables commePATH
,MANPATH
…)for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
(l'expansion de~
étant pris comme modèle dans AT&Tksh
mais pasbash
depuis la 4.0).case ~ in ~) ...
${var#~}
(mais pas dans certains autres shells)cmd foo=~
(mais pas lorsqu'il est appelé en tant quesh
, et seulement quand ce qui est à gauche du=
a la forme d'unbash
sans guillemets nom de la variable)cmd ~/x
(requis par POSIX évidemment)cmd ~:x
(mais pasx:~:x
oux-~-x
)a[~]=foo; echo "${a[~]} $((a[~]))"
(pas dans certains autres shells)
Voici quelques exemples où il n'est pas développé :
echo "~" '~'
echo [email protected] ~~
(notez également que~u
est destiné à s'étendre au répertoire personnel de l'utilisateuru
).echo @~
(( HOME == ~ ))
,$(( var + ~ ))
- avec
extglob
:case $var in @(~|other))...
(bien quecase $var in ~|other)
est OK). ./configure --prefix=~
(comme--prefix
n'est pas un nom de variable valide)cmd "foo"=~
(enbash
, à cause des guillemets).- lorsqu'il est appelé en tant que
sh
:export "foo"=~
,env JAVA_HOME=~ cmd
…
Quant à ce qu'il se développe :~
seul s'étend au contenu de HOME
variable, ou lorsqu'elle n'est pas définie, au répertoire personnel de l'utilisateur actuel dans la base de données des comptes (en tant qu'extension puisque POSIX laisse ce comportement indéfini).
Il convient de noter que dans ksh88 et bash
versions antérieures à 4.0, l'expansion du tilde a subi un globbing (génération de nom de fichier) dans les contextes de liste :
$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~
Cela ne devrait pas être un problème dans les cas habituels.
Notez qu'étant donné qu'il est déplié, le même avertissement s'applique aux autres formes de dépliement.
cd ~
Ne fonctionne pas si $HOME
commence par -
ou contient ..
Composants. Donc, même s'il est très peu probable que cela fasse une différence, à proprement parler, on devrait écrire :
cd -P -- ~
Ou encore :
case ~ in
(/*) cd -P ~;;
(*) d=~; cd -P "./$d";;
esac
(pour couvrir les valeurs de $HOME
comme -
, +2
…) ou simplement :
cd
(comme cd
vous amène à votre répertoire personnel sans aucun argument)
D'autres shells ont des ~
plus avancés extensions. Par exemple, dans zsh
, nous avons :
~4
,~-
,~-2
(avec complétion) utilisé pour développer les répertoires dans votre pile de répertoires (les endroits où vous avezcd
à avant).- répertoires nommés dynamiques . Vous pouvez définir votre propre mécanisme pour décider comment
~something
est en cours d'extension.