Según esta respuesta y mi propio entendimiento, la tilde se expande al directorio de inicio:
$ echo ~
/home/braiam
Ahora, cada vez que quiera que funcione la expansión de shell, es decir, usando nombres de variables como $FOO
, y no se rompan debido a caracteres inesperados, espacios, etc., uno debe usar comillas dobles "
:
$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces
¿Por qué esta expansión no funciona con la tilde?
$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path
--path ~/myfile
expande pero--path=~/myfile
no lo hace.Respuestas:
La razón, porque dentro de las comillas dobles, tilde
~
no tiene un significado especial, se trata como literal.POSIX define comillas dobles como:
Excepto $, `, \y @, otros personajes son tratados como comillas dobles dentro de literales.
fuente
$HOME
.~
, por ejemplols -l ~/"My Documents"
La expansión de Tilde se define por POSIX como:
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:
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:
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.fuente
""
.~
se origina en el shell C, mucho antes de que se agregue al shell Korn y luego se agregue a la especificación del shell POSIX.En el C-shell,
~
era un operador global (expandido por la misma rutina que la que se expande,*.txt
por ejemplo), por lo que al igual que el resto del global no se realizó entre comillas dobles.fuente
Si bien esto no responde por qué está diseñado de esa manera, en su
$HOME
lugar lo usa si necesita sustituirlo, ya que eso es esencialmente lo que~
hace.fuente
~otheruser
~otheruser
muestra qué mala idea era tratar de manera~
diferente a las variables y otras cosas que se expanden entre comillas dobles.