De acordo com esta resposta e meu próprio entendimento, o til se expande para o diretório inicial:
$ echo ~
/home/braiam
Agora, sempre que eu quiser que a expansão do shell funcione, ou seja, use nomes de variáveis como $FOO
e não quebre caracteres inesperados, espaços, etc., deve-se usar aspas duplas "
:
$ FOO="some string with spaces"
$ BAR="echo $FOO"
$ echo $BAR
echo some string with spaces
Por que essa expansão não funciona com o til?
$ echo ~/some/path
/home/braiam/some/path
$ echo "~/some/path"
~/some/path
--path ~/myfile
expande, mas--path=~/myfile
não.Respostas:
O motivo, porque entre aspas duplas, til
~
não tem significado especial, é tratado como literal.O POSIX define aspas duplas como:
Exceto $, `, \e @, outros caracteres são tratados como aspas duplas dentro literais.
fonte
$HOME
.~
, por exemplols -l ~/"My Documents"
A expansão de til é definida pelo POSIX como:
Portanto, a resposta mais curta é "porque é definida dessa maneira": citar qualquer um dos caracteres no prefixo, incluindo o
~
, suprime a expansão.Ele também define a expansão como sempre resultando em uma única palavra; portanto, citar seria desnecessário:
Onde parte do caminho requer citações, mas o restante é um prefixo de til, você pode combinar a expansão de til e as citações comuns diretamente:
No "porquê" mais amplo: como não há uso concebível para a divisão de palavras
~
, esse deve ser o comportamento padrão, em vez de exigir que seja citado. Como não há necessidade de citá-lo, atribuir~
um significado especial a aspas seria uma complicação desnecessária. E, é claro, razões históricas significam que não poderia ser alterado agora, mesmo que isso fosse desejável.fonte
""
.~
se origina no shell C, muito antes de ter sido adicionado ao shell Korn e posteriormente adicionado à especificação do shell POSIX.No C-shell,
~
havia um operador de globbing (expandido pela mesma rotina que o de expansão,*.txt
por exemplo), assim como o resto do globbing não era realizado entre aspas duplas.fonte
Embora isso não responda por que foi projetado dessa maneira, você o utiliza
$HOME
se precisar substituí-lo, já que é basicamente~
isso que acontece.fonte
~otheruser
~otheruser
mostra como foi uma má idéia tratar de forma~
diferente das variáveis e outras coisas que são expandidas entre aspas duplas.