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 !