Selon cette réponse et ma propre compréhension, le tilde s'étend au répertoire de base:
$ echo ~
/home/braiam
Maintenant, chaque fois que je veux que l'extension du shell fonctionne, c'est-à-dire en utilisant des noms de variables tels que $FOO
, et que les caractères inattendus, les espaces, etc. ne soient pas interrompus, il convient d'utiliser des guillemets doubles "
:
$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces
Pourquoi cette extension ne fonctionne-t-elle pas avec le tilde?
$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path
--path ~/myfile
s’agrandit sur un argument de commande mais--path=~/myfile
ne le fait pas.Réponses:
La raison, parce que dans les guillemets doubles, tilde
~
n’a pas de signification particulière, elle est traitée comme littérale.POSIX définit les guillemets doubles comme:
À l' exception $, `, \et @, d' autres personnages sont traités comme littéral à l' intérieur des guillemets doubles.
la source
$HOME
.~
, par exemplels -l ~/"My Documents"
Le développement de tilde est défini par POSIX comme suit:
Donc, la réponse la plus courte est "parce que c'est défini ainsi": citer l'un des caractères du préfixe, y compris le
~
, supprime le développement.Il définit également le développement comme résultant toujours en un seul mot, il serait donc inutile de citer:
Là où une partie du chemin nécessite une citation, mais le reste est un préfixe tilde, vous pouvez combiner le développement de tilde et une citation ordinaire:
Sur le "pourquoi" plus large: comme il n’ya pas d’utilisation concevable pour le fractionnement de mots
~
, cela devrait être le comportement par défaut, plutôt que d’exiger qu’il soit cité. Parce qu'il n'est pas nécessaire de le citer, donner~
une signification spéciale entre guillemets serait une complication inutile. Et, bien sûr, des raisons historiques signifient que cela ne pourrait pas être changé maintenant même si cela était souhaitable.la source
""
.~
provient du C-shell, bien avant qu'il ne soit ajouté au shell Korn, puis ajouté à la spécification du shell POSIX.Dans le C-shell, il y
~
avait un opérateur de déplacement (développé par la même routine que celle*.txt
par exemple), donc, comme le reste du déplacement, il n'était pas exécuté entre guillemets.la source
Bien que cela ne réponde pas pourquoi il est conçu de cette façon, vous utilisez
$HOME
plutôt si vous devez remplacer, car c'est essentiellement ce que vous faites~
.la source
~otheruser
~otheruser
montre quelle mauvaise idée était de traiter~
différemment les variables et autres éléments développés entre guillemets.