Como você sabe, ~ se expande para o seu diretório pessoal. Mas o que você parece ter perdido é que ~john se expande para o diretório home do usuário chamado "john".
Verifique seu arquivo /etc/passwd :
% grep ker /etc/passwd
kernoops:x:107:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
Tem um "usuário do sistema" chamado kernoops (por razões internas de relatório de erros). Então quando você digita cd ~k Tab o shell dá preferência (1) à expansão do nome de usuário antes da expansão dos diretórios locais, e você tem cd ~kernoops . Agora resulta que o usuário "kernoops" home dir é / , então cd s para ele.
No meu shell, zsh , não tenho barra dupla (2):
[:/] % cd ~kernoops/
[:/] % pwd
/
[:/] % cd //
[:/] % pwd
/
Como um aparte, esse nome de diretório não é bem pensado. Ele precisará de três cuidados em scripts e qualquer outra coisa. A única pior ideia que posso imaginar é incorporar uma guia ...
Notas de rodapé:
(1) Em zsh , mesmo se eu tiver um diretório chamado ~xdir e nenhum usuário começar com x ; fazer cd ~x Tab não expande e nem citar o ~ dá erro:
[:~/tmp/x] % mkdir \~xdir
[:~/tmp/x] % ls
~xdir
[:~/tmp/x] % cd ~xdir
zsh: no such user or named directory: xdir
[:~/tmp/x] 1 %
(2) Eu pareço lembrar que posix fez uma exceção para o // inicial em um caminho --- ele deve ser mantido porque alguma variante antiga do unix (eu usei o apollos com o Domain / OS que o possuía) usava //machine-name/... para acessar facilmente o sistema de arquivos de outras máquinas na rede local (a segurança ainda não havia sido inventada). Então, provavelmente, o bash está bem aqui. Se você fizer cd /// , você terá o% normal/ em ambos os shell.
Sim, encontrado em unix.se !