Znaczenie tyldy w Linux bash (nie katalog domowy)

106

Po pierwsze, wiem, że ~/to katalog domowy. CD do katalogu domowego ~lub ~/przenosi mnie do katalogu domowego.

Jednak cd ~Xprzenosi mnie w szczególne miejsce, gdzie Xwydaje się być wszystko.

W bashu, jeśli wbiję " cd ~" i wciskam zakładkę, to pokazuje kilka możliwych ~Xopcji, takich jak ~maili ~postgresi ~ssh. Przejście do tych folderów i wykonanie a pwdpokazuje mi, że tych folderów nie ma w katalogu domowym; są wszędzie.

Nie są aliasami. Sprawdziłem. Nie są env.zmiennymi, bo inaczej wymagałyby rozszerzenia $.

Co to jest ustawianie tych linków i gdzie mogę się dowiedzieć, gdzie są one ustawiane?

jbu
źródło
~ X po prostu zwraca literał "~ X", ale ~ zwraca $ HOME, a ~ + zwraca $ PWD - nie są one niczym specjalnym poza tym, że pobierają zmienne powłoki. tj. nie przechowują wartości ani nie wykonują polecenia, aby je wyszukać. Są już zdefiniowane. Czy próbowałeś ~ -? Nie mogę wymyślić dla niego zastosowania, ale znowu zwraca zmienną powłoki $ OLDPWD
SDsolar

Odpowiedzi:

71

To funkcja Bash zwana „ rozszerzeniem tyldy ”. Jest to funkcja powłoki, a nie systemu operacyjnego. Na przykład uzyskasz inne zachowanie z csh.

Odpowiadając na pytanie, skąd pochodzą informacje: twój katalog domowy pochodzi ze zmiennej $HOME(bez względu na to, co tam przechowujesz), podczas gdy domy innych użytkowników są pobierane w czasie rzeczywistym za pomocą getpwent(). Ta funkcja jest zwykle kontrolowana przez NSS ; więc domyślnie wartości są pobierane /etc/passwd, chociaż można je skonfigurować tak, aby pobierały informacje przy użyciu dowolnego żądanego źródła, takiego jak NIS, LDAP lub baza danych SQL.

Rozwijanie tyldy to coś więcej niż przeszukiwanie katalogu domowego. Oto podsumowanie:

~              $HOME
~fred          (freds home dir)

~+             $PWD       (your current working directory)
~-             $OLDPWD    (your previous directory)
~1             `dirs +1`
~2             `dirs +2`
~-1            `dirs -1`

dirsa ~1, ~-1itp, są używane w połączeniu z pushda popd.

tylerl
źródło
uwaga, ryba nie obsługuje żadnego z nich poza zwykłą tyldą (~)
dlaczego wymyślili ~+? wydaje się raczej bezużyteczna.
cregox
3
~ + jest mniej więcej tym samym, co. Jednak aby użyć czegoś takiego jak ./file, musi przejść do systemu plików i dowiedzieć się, gdzie. znajduje się - zajmuje to kilka cykli. Użycie ~ + oszczędza pracę, po prostu zwracając zawartość zmiennej powłoki $ PWD, która jest już zdefiniowana podczas przechodzenia przez system plików.
SDsolar
32

To są katalogi domowe użytkowników. Spróbuj cd ~(your username)na przykład.

Ana Betts
źródło
1
To nie są linki symboliczne, konta usług nie mają katalogów domowych w / home
Ana Betts
Najlepsza odpowiedź w moim przypadku. Ponadto w moim przypadku był to katalog / folder główny, a nie katalog domowy.
wlwl2
16

Czy są to katalogi domowe użytkowników /etc/passwd? Usługi takie jak postgres, sendmail, apache itp. Tworzą użytkowników systemu, którzy mają katalogi domowe, tak jak zwykli użytkownicy.

Sean Bright
źródło
2
Rzeczywiście są ~ nazwa użytkownika to katalog domowy określonego użytkownika
Steve Weet
14

To są użytkownicy. Sprawdź swoje /etc/passwd.

cd ~username przeniesie Cię do katalogu domowego tego użytkownika.

Joakim Elofsson
źródło
FTW. Głosuj za. TNX za wyjaśnienie tego. Zastanawiam się, ile cykli, a może nawet podpowłoki jest w tym zaangażowanych. Wyobraź sobie, że Twój system ma 3 tys. Użytkowników, na przykład u małego dostawcy usług internetowych. Yikes.
SDsolar
9

Na moim komputerze, ze względu na sposób skonfigurowania rzeczy, robię:

cd ~             # /work1/jleffler
cd ~jleffler     # /u/jleffler

Pierwsza zwraca uwagę na wartość zmiennej środowiskowej $HOME; Celowo ustawiłem $HOMElokalny system plików zamiast systemu plików podłączonego do NFS. Drugi czyta z pliku haseł (w przybliżeniu; NIS trochę komplikuje) i stwierdza, że ​​plik z hasłami mówi, że mój katalog domowy jest /u/jleffleri zmienia się w tym katalogu.

Irytujące jest to, że większość programów zachowuje się jak powyżej (a specyfikacja POSIX dla powłoki wymaga takiego zachowania). Używam oprogramowania (i nie mam dużego wyboru co do jego używania), które traktuje informacje z pliku z hasłami jako bieżącą wartość $ HOME, co jest błędne.

Odnosząc to do pytania - jak zauważyli inni, ' cd ~x' przechodzi do katalogu domowego użytkownika 'x', a bardziej ogólnie, gdy zostanie wykonane rozwinięcie tyldy, ~xoznacza katalog domowy użytkownika 'x' (i jest to błąd jeśli użytkownik „x” nie istnieje).


Warto wspomnieć, że:

cd ~-       # Change to previous directory ($OLDPWD)
cd ~+       # Change to current directory ($PWD)

Nie mogę od razu znaleźć zastosowania dla „ ~+”, chyba że robisz dziwne rzeczy z przenoszeniem linków symbolicznych w ścieżce prowadzącej do bieżącego katalogu.

Możesz też:

cd -

To znaczy to samo co ~-.

Jonathan Leffler
źródło
1
O cd ~+: możesz go potencjalnie użyć do sprawdzenia, czy katalog, w którym aktualnie jesteś, nadal istnieje - nawet jeśli jest to dość niekonwencjonalny sposób zrobienia tego.
profesora
1

Jeśli używasz, autofsrozszerzenie może faktycznie pochodzić z /etc/auto.home(lub podobnie w przypadku twojej dystrybucji). Na przykład mój /etc/auto.masterwygląd wygląda tak:

/home2 auto.home --timeout 60

i /etc/auto.homewygląda następująco:

mgalgs -rw,noquota,intr space:/space/mgalgs
mgalgs
źródło
0

Możliwe, że widzisz użytkowników OpenDirectory / ActiveDirectory / LDAP „automatycznie podłączonych” do twojego katalogu domowego.

W * nix, ~rozwiąże do twojego katalogu domowego. Podobnie ~Xrozwiąże się z „użytkownikiem X”.

Podobnie jak w przypadku automatycznego montowania katalogów, OpenDirectory / ActiveDirectory / LDAP jest używany w większych / korporacyjnych środowiskach do automatycznego montowania katalogów użytkowników. Tymi użytkownikami mogą być rzeczywiste osoby lub konta maszyn utworzone w celu zapewnienia różnych funkcji.

Jeśli wpiszesz ~Tab, zobaczysz listę użytkowników na twoim komputerze.

JS.
źródło