~ é um nome especial expandido pelo shell, . e .. são nomes de diretório reais, portanto, nenhuma expansão é feita pelo shell lá.
Como ~ , . e .. são diretórios especiais, por que eles são tratados de maneira diferente no exemplo a seguir?
$ echo ~
/home/tim
$ echo ..
..
$ echo .
.
~ é expandido para o diretório, mas os outros dois não são. ~ não é. ~ é um nome especial expandido pelo shell, . e .. são nomes de diretório reais, portanto, nenhuma expansão é feita pelo shell lá.