O que é ~ foo
Citação do manual do bash (com adição de ênfase):
If a word begins with an unquoted tilde character ('~'), all of the characters preceding the first unquoted slash (or all characters, if there is no unquoted slash) are considered a tilde-prefix.If none of the characters in the tilde-prefix are quoted, the characters in the tilde-prefix following the tilde are treated as a possible login name.
~foo
expande para o diretório base do usuário de foo
exatamente conforme especificado em /etc/passwd
. Observe que isso pode incluir nomes de usuários do sistema; isso não significa necessariamente usuários humanos ou que eles podem realmente efetuar login localmente (eles podem efetuar login via chaves SSH, por exemplo).
Na verdade, conforme observado no comentários , bash
usará a função getpwnam
. Essa função em si é especificada pelo padrão POSIX , portanto deve existir na maioria dos sistemas semelhantes ao Unix, incluindo macOS X . Essa função não está limitada a /etc/passwd
apenas e pesquisa outros bancos de dados, como LDAP e NIS. Trecho particular de bash
código-fonte , tilde.c
arquivo, começando na linha 394:
/* No preexpansion hook, or the preexpansion hook failed. Look in the
password database. */
dirname = (char *)NULL;
#if defined (HAVE_GETPWNAM)
user_entry = getpwnam (username);
#else
user_entry = 0;
Exemplo prático
Abaixo você pode ver testes com nomes de usuários do sistema no meu sistema. Preste atenção na entrada passwd
correspondente e no resultado de ls ~username
$ grep '_apt' /etc/passwd
_apt:x:104:65534::/nonexistent:/bin/false
$ ls ~_apt
ls: cannot access '/nonexistent': No such file or directory
$ grep '^lp' /etc/passwd
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
$ ls ~lp
ls: cannot access '/var/spool/lpd': No such file or directory
Mesmo se, por exemplo, a conta _apt
estiver bloqueada, conforme sugerido pela saída de passwd -S apt
, ela ainda será exibida como o nome de login possível:
_apt L 11/29/2017 0 99999 7 -1
Observe: Esse não é um recurso específico do MacOS, mas um recurso específico do shell.