Le développement de tilde est défini par POSIX comme suit:
A « préfixe tilde » se compose d'un unquoted <tilde> caractère au début d'un mot, suivi de l' ensemble des caractères précédant le premier unquoted <slash> dans le mot, ou tous les caractères dans le mot , s'il n'y a pas < slash>. Dans une assignation, plusieurs préfixes tilde peuvent être utilisés: [...] suivant le signe <equals-sign> de l'affectation, après tout <colon> sans guillemets, ou les deux. [...] Si aucun des caractères du préfixe tilde n'est cité, les caractères du préfixe tilde suivant le <tilde> sont traités comme un nom de connexion possible de la base de données utilisateur. [...] Si le nom de connexion est null (c'est-à-dire que le préfixe tilde ne contient que le tilde), le préfixe tilde est remplacé par la valeur de la variable HOME. Si HOME n'est pas défini, les résultats ne sont pas spécifiés. [...]
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:
Le nom de chemin résultant de l’agrandissement du tilde doit être traité comme si il était cité pour éviter qu’il ne soit altéré par la division du champ et l’extension du nom de chemin.
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:
$ cat ~/"file name with spaces"
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.