Ce qu'il est important de comprendre, c'est que l' ~
expansion est une fonctionnalité du shell (de certains shell), ce n'est pas un caractère magique qui désigne 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), de la même manière que $var
sa valeur est développée 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é normalisé par POSIX et est maintenant disponible dans la plupart des shells, y compris ceux non-POSIX fish
.
Du fait de son utilisation très répandue dans les shells, certaines applications non-shell le reconnaissent également comme désignant le répertoire de base. C'est le cas de nombreuses applications dans leurs fichiers de configuration ou de leur propre ligne de commande ( mutt
, slrn
, vim
...).
bash
spécifiquement (qui est le shell du projet GNU et qui est largement utilisé dans de nombreux systèmes d’exploitation basés sur Linux), quand elle est invoquée en tant que sh
suit les règles POSIX concernant le ~
développement, et dans les zones non spécifiées par POSIX, se comporte principalement comme le shell Korn (de dont il s’agit d’un clone partiel).
Alors que $var
est étendu dans la plupart des endroits (sauf dans les guillemets simples), l' ~
expansion, après-coup, n'est développée que dans quelques conditions spécifiques.
Il est développé lorsque son propre argument est utilisé dans des contextes de liste, dans des contextes dans lesquels une chaîne est attendue.
Voici quelques exemples d’extensions bash
:
cmd arg ~ other arg
var=~
var=x:~:x
(requis par POSIX, utilisé pour des variables telles que PATH
, MANPATH
...)
for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
(L’expansion ~
est considérée comme une tendance chez AT & T ksh
mais pas bash
depuis la 4.0).
case ~ in ~) ...
${var#~}
(mais pas dans d'autres coquilles)
cmd foo=~
(mais pas quand invoqué sh
, et seulement quand ce qui est à gauche =
est formé comme un bash
nom de variable sans guillemets )
cmd ~/x
(requis par POSIX évidemment)
cmd ~:x
(mais pas x:~:x
ou x-~-x
)
a[~]=foo; echo "${a[~]} $((a[~]))"
(pas dans d'autres coquilles)
Voici quelques exemples où ce n'est pas développé:
echo "~" '~'
echo ~@ ~~
(notez également que cela ~u
est destiné à être étendu au répertoire de base de l'utilisateur u
).
echo @~
(( HOME == ~ ))
, $(( var + ~ ))
- avec
extglob
: case $var in @(~|other))...
(si case $var in ~|other)
c'est OK).
./configure --prefix=~
(comme --prefix
n'est pas un nom de variable valide)
cmd "foo"=~
(en bash
, à cause des guillemets).
- comme lorsqu'il est appelé
sh
: export "foo"=~
, env JAVA_HOME=~ cmd
...
Quant à ce qui se développe: ~
seul se développe au contenu de la HOME
variable, ou lorsqu'elle n'est pas définie, au répertoire de base de l'utilisateur actuel dans la base de données de comptes (en tant qu'extension puisque POSIX laisse ce comportement indéfini).
Il convient de noter que, dans ksh88 et dans les bash
versions antérieures à 4.0, l’extension tilde était globalisée (génération de nom de fichier) dans des 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 que, comme il est développé, le même avertissement s’applique aux autres formes d’expansion.
cd ~
Ne fonctionne pas si $HOME
commence avec -
ou contient des ..
composants. Ainsi, même s'il est très peu probable de faire une différence, à proprement parler, il convient d'écrire:
cd -P -- ~
Ou même:
case ~ in
(/*) cd -P ~;;
(*) d=~; cd -P "./$d";;
esac
(pour couvrir des valeurs de $HOME
comme -
, +2
...) ou simplement:
cd
(comme cd
vous mène à votre répertoire personnel sans aucun argument)
D'autres coquilles ont des ~
expansions plus avancées . Par exemple, dans zsh
, nous avons:
~4
, ~-
, ~-2
(Avec l' achèvement) utilisé pour élargir les répertoires dans votre pile de répertoires (les endroits que vous avezcd
à avant).
- répertoires nommés dynamiques . Vous pouvez définir votre propre mécanisme pour décider de la manière dont elle
~something
sera développée.
~
cela sera équivalent à$HOME
n'importe quel environnement POSIX; mais je peux me tromper.