Editar: Esta é uma duplicata do /programming/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 ~
como no diretório inicial, mas sim:
$ 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
Como é ~
chamado neste contexto? Como funciona?
Editar: 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 concluir automaticamente,
ls -lah ~
nem todas as opções são mostradas. ou seja, eu consigocd ~qux
, quandoqux
não aparece no preenchimento automático. Novamente,qux
não é um usuário no meu sistema. - Se isso importa
/some/mount/point
é um compartilhamento de rede. - Todos os detalhes sugerem algum caminho chamado muckery, um recurso de 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.
command-line
osx
RD
fonte
fonte
~foo
é o diretório inicial do usuáriofoo
. Se o usuário não for especificado, o usuário atual é o padrão./some/mount/point
definitivamente não é o meu diretório pessoal.cd ~
me leva para/Users/$username/
--que combina com$HOME
zsh
parece também usar o til para indicar diretórios nomeados.bash -c "ls ~foo/bar"
) - que não possui diretórios nomeados. Além disso, mesmo no zsh, se eu inspecionar o arquivoenv
, não vejo nenhum diretório nomeado configurado. Eu estou no Mac OS e eu sinto que este é alguma característica específica para OS X.~foo
. Pegue a string real (não o exemplofoo
) e façagrep "actual username" /etc/passwd
.~text
deve funcionar apenas para nomes de usuário de login possíveis, de acordo com o manual do bash (não significa necessariamente que é realmente capaz de efetuar login; no caso de usuários do sistema, como~lp
, por exemplo). Em todos os meus testes, o~string
corresponde astring
ser nome de usuário.Respostas:
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 podem realmente fazer login localmente (eles podem fazer login via chaves SSH, por exemplo).De fato, conforme observado nos comentários ,
bash
usará agetpwnam
função Que a função em si é especificado por POSIX padrão, portanto, deve existir em mais Unix-like sistemas, incluindo MacOS X . Essa função não se limita/etc/passwd
apenas e pesquisa 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 testes com nomes de usuário do sistema no meu sistema. Preste atenção à
passwd
entrada e resultado correspondentes dels ~username
Mesmo se, por exemplo, a
_apt
conta estiver bloqueada, conforme sugerido pela saída,passwd -S apt
ela ainda será exibida como possível nome de login:Observe: Este não é um recurso específico do macOS, mas sim um recurso específico do shell.
fonte
/etc/shadow
, juntamente com as outras informações de autenticação protegidas, como a senha. A referência empasswd
é sobre tornar a senha inválida: isso não impediria a autenticação por outros meios.testuser
e modificando a data de validade da senha. O nome de usuário ainda aparece na conclusão da guia. Eu removi esse pedaço da resposta #bash
página de manual (e antiga, ao que parece). O OP está realmente usandozsh
(poderia ter sido mais claro), embora nos comentários seja mencionado quebash
tenha o mesmo comportamento.getent passwd foo
vez degrep foo /etc/password
seguir os mesmos mecanismos de pesquisa que o shell - talvez incluindo serviços de diretório baseados em rede mencionados pelo @Abigail.Em resumo do motivo pelo qual você está procurando algo
~foo/bar
, é porque você tem um usuário nomeadofoo
no sistema com uma pasta nomeadabar
no 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 do bin pelo comando:ls ~bin
Outra coisa que você pode tentar é usar o preenchimento de tabulação após digitar o seguinte em um prompt (não retorne o carro, basta usar a tecla tab):
ls -lah ~
tabpara ver a lista de diretórios pessoais dos usuários que
~
serão expandidos se você continuar. Exemplo (truncado) de saída da conclusão da guia dels -lah ~
tabfonte
/etc/passwd
. Imediatamente ajuda a esclarecer o que está acontecendo se o usuário, obviamente, estiver ciente dos nomes de usuário que possui no sistema.~foo
o preenchimento automático, posso atestar quefoo
não é um usuário no meu sistema (e de fato não existe no/etc/passwd
). Além disso, todas as pastas / arquivos/some/mount/point
aparecem no preenchimento automático, o que é super interessante.