Edit: Esta é uma duplicata de https://stackoverflow.com/questions/998626/meaning-of-tilde-in-linux-bash-not-home-directory/ . Não tenho reputação de fechar esta pergunta como duplicada.
Não estou me referindo ao ~
diretório inicial, mas a isso:
$ ls ~foo/bar
/some/mount/point/foo/bar
No entanto, se eu tentar com um ponto de montagem diferente, por exemplo:
$ mount | ag "/dev "
devfs on /dev (devfs, local, nobrowse)
$ ls /dev/stdin
/dev/stdin
$ ls ~stdin
zsh: no such user or named directory: stdin .
# bash has a similar error message:
ls: ~stdin: No such file or directory
Qual é o ~
chamado neste contexto? Como funciona?
Edit: Mais informações com base em alguns dos comentários abaixo:
- Posso atestar que
foo
não é um nome de usuário no meu sistema. - Ao tentar preencher automaticamente
ls -lah ~
, nem todas as opções são mostradas. ou seja, consigocd ~qux
, quandoqux
não aparece no preenchimento automático. Novamentequx
não é um usuário em meu sistema. - Se importa
/some/mount/point
é um compartilhamento de rede. - Todos os detalhes sugerem alguma sujeira de caminho nomeado, um recurso do shell Z da expansão do nome do caminho, mas isso também funciona no bash, que aparentemente não suporta coisas como os caminhos nomeados do shell Z.
O que é ~foo
Citação do manual do bash (com ênfase adicional):
~foo
expande parafoo
o diretório inicial do usuário exatamente como especificado em/etc/passwd
. Observe que isso pode incluir nomes de usuário do sistema; isso não significa necessariamente usuários humanos ou que eles possam fazer login localmente (eles podem fazer login por meio de chaves SSH, por exemplo).Na verdade, conforme observado nos comentários ,
bash
usará agetpwnam
função. Essa função em si é especificada pelo padrão POSIX , portanto, deve existir na maioria dos sistemas semelhantes ao Unix, incluindo o macOS X . Esta função não se limita/etc/passwd
apenas a pesquisas em outros bancos de dados, como LDAP e NIS. Trecho particular dobash
código-fonte ,tilde.c
arquivo, começando na linha 394:Exemplo prático
Abaixo você pode ver os testes com nomes de usuário do sistema em meu sistema. Preste atenção à
passwd
entrada correspondente e ao resultado dals ~username
Mesmo que, por exemplo , a
_apt
conta esteja bloqueada conforme sugerido pela saídapasswd -S apt
, ela ainda está aparecendo como possível nome de login:Observação: este não é um recurso específico do macOS, mas sim um recurso específico do shell.
Em resumo, por que você está vendo algo para
~foo/bar
, é porque você tem um usuário nomeadofoo
no sistema com uma pasta nomeadabar
em seu diretório inicial.Veja esta solução em outra comunidade que explica por que (til)
~
é mais do que apenas "diretório inicial".Se você tiver um usuário nomeado
bin
em seu sistema, poderá listar o conteúdo do diretório inicial de bin pelo comando:ls ~bin
Outra coisa que você pode tentar é usar a conclusão de tabulação após digitar o seguinte em um prompt (não use o retorno de carro, apenas use a tecla tab):
ls -lah ~
tabpara ver a lista de diretórios pessoais dos usuários que
~
serão expandidos se você continuar. Exemplo de saída (truncada) de conclusão de tabulação dels -lah ~
tab