Nieoczekiwane zakończenie Bash ~ na OS X

13

Nacisnąłem ~TabTabwiersz polecenia bash i otrzymałem nieoczekiwany zestaw uzupełnień.

Najpierw wyglądało to tak, jak wszyscy ludzie w /Userskatalogu i wiele więcej.

Potem pomyślałem, że robi to odwrotnie, szukając ludzi z „domowymi” katalogami /etc/password, a może tymi, które były /var/empty- wydaje się to słuszne.

Ciekawe, co się naprawdę dzieje i dlaczego tak działa.

Walt Stoneburner
źródło

Odpowiedzi:

21

Nie mam pod ręką systemu OSX do sprawdzenia, ale na wszystkich * nixach ~foojest to skrót od katalogu domowego użytkownika foo. Na przykład to polecenie przeniesie się do mojego użytkownika $HOME( cd ~sam przejdzie do twojego katalogu domowego):

cd ~terdon

Tak więc ~i Tabrozszerzy się na wszystkie możliwe nazwy użytkowników. Lista powinna być taka sama jak lista użytkowników w /etc/passwd.

Mogę potwierdzić, że dokładnie tak się dzieje, kiedy próbuję tego na moim Debianie.

terdon
źródło
Tak samo jest, kiedy próbuję na FreeBSD.
Jenny D
Rzeczą, która mnie rzuciła, było to, że nie miałem katalogów w / home dla tych użytkowników. W rzeczywistości wielu powiedziało / var / empty. Doszedłem do wniosku, że takie uzupełnienia były przez wyszukiwanie dysku, więc ~ szukałby rzeczywistego katalogu domowego na dysku zamiast wpisów / etc / passwd. Ponieważ ~ naprawdę oznacza „katalog domowy użytkownika”, a nie skrót do katalogu / home (lub / User), w moim przypadku OS X rozszerzenie referencje / var / empty. Nauczyłem się czegoś nowego! Dzięki!
Walt Stoneburner
Poniższa odpowiedź @ WaltStoneburner fdo sugeruje, że OSX robi coś innego, nie wiem. W Linuksie utworzenie katalogu nie /homema znaczenia, ponieważ nie spowoduje to umieszczenia nowej nazwy użytkownika na liście. Pamiętaj też, że nie wszystkie DOMY użytkowników $ są w /home(lub /Users).
terdon
@terdon - Myślę, że przybiłeś ją swoją odpowiedzią. Na moim koncie Linux mam dovenull użytkownika, który ma fałszywy katalog / nonexistent, pokazuje się w autouzupełnianiu, ale polecenie cd kończy się niepowodzeniem (zgodnie z oczekiwaniami).
Walt Stoneburner
2

Myślałem, że to odwrotne wyszukiwanie ludzi z katalogami „home” w / etc / password.

W OS X konsultowany jest Open Directory zamiast / etc / passwd.

fd0
źródło
1

Bash Reference Manual mówi :

Bash próbuje zakończyć traktując tekst jako nazwę użytkownika (jeśli tekst zaczyna się od „~”)

Bash używa getpwent funkcji do ukończenia.

man getpwent na OSX mówi:

Funkcje te uzyskują informacje z opendirectoryd (8), w tym rekordy w /etc/master.passwd, które opisano w master.passwd (5).

Evgeny Vereshchagin
źródło