La expansión de Tilde se define por POSIX como:
Un "prefijo tilde" consiste en un carácter <tilde> sin comillas al comienzo de una palabra, seguido de todos los caracteres que preceden al primer <slash> sin comillas en la palabra, o todos los caracteres en la palabra si no hay < barra oblicua>. En una asignación, se pueden usar múltiples prefijos de tilde: [...] siguiendo el <equals-sign> de la asignación, siguiendo cualquier <colon> sin comillas, o ambos. [...] Si ninguno de los caracteres en el prefijo tilde se cita, los caracteres en el prefijo tilde después de <tilde> se tratan como un posible nombre de inicio de sesión de la base de datos de usuarios. [...] Si el nombre de inicio de sesión es nulo (es decir, el prefijo tilde contiene solo la tilde), el prefijo tilde se reemplaza por el valor de la variable HOME. Si HOME no está configurado, los resultados no están especificados. [...]
Entonces, la respuesta más corta es "porque se define de esa manera": al citar cualquiera de los caracteres del prefijo, incluido el ~
, se suprime la expansión.
También define la expansión como siempre dando como resultado una sola palabra, por lo que sería innecesario citar:
El nombre de ruta resultante de la expansión de tilde se tratará como si fuera citado para evitar que sea alterado por la división de campo y la expansión de nombre de ruta.
Cuando algunas de las rutas requieren comillas, pero el resto es un prefijo de tilde, puede combinar la expansión de tilde y las comillas ordinarias directamente:
$ cat ~/"file name with spaces"
En el "por qué" más amplio: dado que no hay un uso concebible para la división de palabras ~
, ese debería ser el comportamiento predeterminado, en lugar de requerir que se cite. Como no es necesario citarlo, dar ~
un significado especial dentro de las comillas sería una complicación innecesaria. Y, por supuesto, las razones históricas significan que no se podría cambiar ahora, incluso si eso fuera deseable.