Edycja: Jest to duplikat /programming/998626/meaning-of-tilde-in-linux-bash-not-home-directory/ . Nie mam reputacji, aby zamknąć to pytanie jako duplikat.
Nie mówię o tym ~
jak w katalogu domowym, ale raczej o tym:
$ ls ~foo/bar
/some/mount/point/foo/bar
Jeśli jednak spróbuję użyć innego punktu montowania, np .:
$ 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
Jak ~
nazywa się w tym kontekście? Jak to działa?
Edycja: Więcej informacji na podstawie niektórych poniższych komentarzy:
- Mogę zaświadczyć, że
foo
nie jest to nazwa użytkownika w moim systemie. - Podczas próby autouzupełniania
ls -lah ~
nie są wyświetlane wszystkie opcje. tzn. jestem w staniecd ~qux
, gdyqux
nie pojawia się w autouzupełnianiu. Ponowniequx
nie jest użytkownikiem w moim systemie. - Jeśli to ważne,
/some/mount/point
to udział sieciowy. - Wszystkie szczegóły sugerują pewne nazwane muckery ścieżek, funkcję powłoki Z w rozszerzaniu nazw ścieżek, ale działa to również w bash, która najwyraźniej nie obsługuje rzeczy takich jak nazwane ścieżki powłoki Z.
command-line
osx
R & D
źródło
źródło
~foo
jest katalogiem domowym użytkownikafoo
. Jeśli użytkownik nie zostanie określony, bieżącym użytkownikiem będzie domyślny./some/mount/point
zdecydowanie nie jest to mój katalog domowy.cd ~
zabiera mnie do -/Users/$username/
które mecze$HOME
zsh
wydaje się również używać tyldy do wskazania nazwanych katalogów.bash -c "ls ~foo/bar"
) - która nie ma nazwanych katalogów. Co więcej, nawet w Zsh, jeśli sprawdzęenv
, nie widzę skonfigurowanych nazwanych katalogów. Korzystam z systemu Mac OS i wydaje mi się, że jest to funkcja specyficzna dla systemu OS X.~foo
. Weź aktualny ciąg (nie przykładfoo
) i zróbgrep "actual username" /etc/passwd
.~text
powinien działać tylko dla możliwych nazw logowania, zgodnie z instrukcją bash (niekoniecznie oznacza, że jest w stanie się zalogować; w przypadku użytkowników systemu, takich jak~lp
na przykład). We wszystkich moich testach~string
odpowiada tostring
byciu nazwą użytkownika.Odpowiedzi:
Co to jest ~ foo
Cytat z podręcznika bash (z dodatkowym naciskiem):
~foo
rozwija się dofoo
katalogu domowego użytkownika dokładnie tak, jak określono w/etc/passwd
. Uwaga: może to obejmować nazwy użytkowników systemu; niekoniecznie oznacza to użytkowników lub fakt, że mogą oni logować się lokalnie (mogą na przykład logować się za pomocą kluczy SSH).W rzeczywistości, jak zauważono w komentarzach ,
bash
użyjegetpwnam
funkcji. Że sama funkcja jest określona przez POSIX standardzie, dlatego powinna istnieć na większości systemów uniksowych, w tym MacOS X . Ta funkcja nie ogranicza się/etc/passwd
tylko do wyszukiwania innych baz danych, takich jak LDAP i NIS. Szczególny fragmentbash
kodu źródłowego ,tilde.c
pliku, zaczynający się od linii 394:Praktyczny przykład
Poniżej możesz zobaczyć testy z nazwami użytkowników systemu w moim systemie. Zwróć uwagę na odpowiedni
passwd
wpis i wynikls ~username
Nawet jeśli na przykład
_apt
konto jest zablokowane, jak sugeruje dane wyjściowepasswd -S apt
, nadal wyświetla się jako możliwa nazwa logowania:Uwaga: To nie jest funkcja specyficzna dla systemu macOS, ale funkcja specyficzna dla powłoki.
źródło
/etc/shadow
wraz z innymi chronionymi informacjami uwierzytelniającymi, takimi jak hasło. Odwołaniepasswd
dotyczy tylko unieważnienia hasła: nie zapobiegnie to uwierzytelnieniu w inny sposób.testuser
i modyfikowaniem daty ważności hasła. Nazwa użytkownika nadal pojawia się po zakończeniu zakładki.bash
stronę podręcznika (i wydaje się, że jest to stara). OP faktycznie używazsh
(mogłoby być jaśniej), chociaż w komentarzach wspomniano, żebash
ma takie samo zachowanie.getent passwd foo
zamiastgrep foo /etc/password
tych samych mechanizmów wyszukiwania co powłoka - być może włączając w to sieciowe usługi katalogowe wspomniane przez @Abigail.Podsumowując, dlaczego coś widzisz
~foo/bar
, to dlatego, że masz w systemie użytkownika o nazwiefoo
z folderem o nazwiebar
w jego katalogu domowym.Zobacz to rozwiązanie w innej społeczności, która wyjaśnia, dlaczego (tylda)
~
to coś więcej niż „katalog domowy”.Jeśli masz w systemie użytkownika o nazwie
bin
, możesz wyświetlić zawartość katalogu domowego bin za pomocą polecenia:ls ~bin
Inną rzeczą, którą możesz wypróbować, jest użycie uzupełniania tabulacji po wpisaniu następującego polecenia (nie wracaj do powrotu, wystarczy użyć klawisza tab):
ls -lah ~
tababy zobaczyć listę katalogów domowych użytkowników,
~
które rozwiną się, jeśli będziesz kontynuować. Przykład (obcięty) wynik tabulacji zls -lah ~
tabźródło
/etc/passwd
. Natychmiast pomaga wyjaśnić, co się dzieje, jeśli użytkownik oczywiście zna nazwy użytkowników, które mają w systemie.~foo
wykonałem autouzupełnianie, mogę zaświadczyć, żefoo
nie jest użytkownikiem w moim systemie (i faktycznie nie istnieje/etc/passwd
). Ponadto wszystkie foldery / pliki/some/mount/point
pojawiają się w autouzupełnianiu, co jest bardzo interesujące.