Conclusão inesperada de Bash do ~ no OS X

13

Pressionei ~TabTabo prompt de comando bash e obtive um conjunto inesperado de conclusões.

Primeiro, parecia com todas as pessoas no /Usersdiretório e muito mais.

Então eu pensei que estava fazendo a pesquisa inversa de pessoas com diretórios "home" /etc/password, ou talvez os que estavam /var/empty- isso parece certo.

O que me interessa é o que realmente está acontecendo e por que isso funciona da mesma maneira.

Walt Stoneburner
fonte

Respostas:

21

Não tenho um sistema OSX à mão para verificar, mas em todos os * nixes, ~fooé uma abreviação para o diretório inicial do usuário foo. Por exemplo, este comando será movido para o meu usuário $HOME( cd ~sozinho será movido para o diretório inicial):

cd ~terdon

Então, ~e Tabserá expandido para todos os nomes de usuário possíveis. A lista deve ser a mesma que a lista de usuários em/etc/passwd .

Posso confirmar que é exatamente isso que acontece quando tento isso no meu Debian.

terdon
fonte
É o mesmo quando eu tento no FreeBSD.
Jenny D
O que me impressionou foi que eu não tinha diretórios em / home para esses usuários. De fato, muitos disseram / var / vazio. Imaginei que essas conclusões eram feitas pela pesquisa do disco, para que o ~ estivesse olhando para o diretório inicial real no disco, em vez das entradas / etc / passwd. Como ~ realmente significa "diretório inicial de um usuário" e não um atalho para / home (ou / User), a expansão faz referência a / var / empty no meu gabinete do OS X. Aprendeu algo novo! Obrigado!
Walt Stoneburner
A resposta do @WaltStoneburner fdo abaixo sugere que o OSX está fazendo algo diferente, não sei. De qualquer forma, no Linux, criar um diretório no /homeé irrelevante, que não fará com que um novo nome de usuário seja listado. Além disso, observe que nem todos os $ HOMEs de usuários estão em /home(ou /Users).
terdon
@terdon - Eu acho que você acertou em cheio com sua resposta. Na minha conta Linux, eu tenho um usuário comum que possui um diretório falso de / inexistente; ele aparece no preenchimento automático, mas o comando cd falha (conforme o esperado).
Walt Stoneburner
2

Eu pensei que estava fazendo a pesquisa inversa de pessoas com diretórios "home" em / etc / password.

No OS X, o Open Directory é consultado em vez de / etc / passwd.

fd0
fonte
1

O Manual de Referência do Bash diz :

O Bash tenta concluir tratando o texto como nome de usuário (se o texto começar com '~')

O Bash usa a getpwent função para conclusão.

man getpwent no OSX diz:

Essas funções obtêm informações do opendirectoryd (8), incluindo registros em /etc/master.passwd, descritos em master.passwd (5).

Evgeny Vereshchagin
fonte