2009-06-15 16 views
86

Po pierwsze, wiem, że ~/ jest katalogiem osobistym. CDing do ~ lub ~/ przenosi mnie do katalogu domowego.Znaczenie tyldy w Linux bash (nie katalogu macierzystym)

Jednak cd ~X zabiera mnie do specjalnego miejsca, gdzie X wydaje się być cokolwiek.

W bash, jeśli uderzę „cd ~” i wciśnij kartę, pokazuje kilka możliwych opcji, takich jak ~mail~X i ~postgres i ~ssh. Przechodzenie do tych folderów i robienie pwd pokazuje mi, że te foldery nie znajdują się w katalogu domowym; są wszędzie.

Nie są to aliasy. Sprawdziłem. Nie są to zmienne env., w przeciwnym razie będą wymagały $.

Co to jest ustawienie tych łączy i gdzie mogę je znaleźć?

+0

~ X po prostu zwraca literał "~ X", ale ~ zwraca $ HOME i ~ + zwraca $ PWD - nie są specjalne, poza tym, że pobierają zmienne powłoki. to znaczy nie przechowują wartości lub wykonują polecenie, aby je wyszukać. Są już zdefiniowane. Czy próbowałeś ~ -? Nie mogę myśleć o użyciu, ale znowu zwraca zmienną powłoki $ OLDPWD – SDsolar

Odpowiedz

16

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

+2

Rzeczywiście są ~ nazwa_użytkownika jest katalogiem domowym określonego użytkownika –

33

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

+1

Nie są dowiązaniami symbolicznymi, konta usług nie mają katalogów domowych under/home –

+0

Najlepsza odpowiedź w moim przypadku. Również w moim przypadku był to katalog główny/folder, a nie folder macierzysty. – William

13

te są użytkownicy, sprawdzić/etc/passwd

cd ~ nazwa_użytkownika

zabierze Cię do użytkowników home dir

+0

FTW. Awansuj. TNX do wyczyszczenia tego. Zastanawiam się, ile cykli, a może nawet podpowłok jest w to zaangażowanych.Wyobraź sobie, że twój system ma użytkowników 3K, jak na małym ISP. Yikes. – SDsolar

9

Na moim komputerze, ze względu na sposób, w jaki zostały rzeczy skonfigurować, wykonanie:

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

Pierwsza zwraca uwagę na wartość zmiennej środowiskowej $HOME; Celowo ustawiłem mój $HOME na lokalny system plików zamiast na systemie plików podłączonym przez NFS. Drugi odczytuje z pliku haseł (w przybliżeniu; NIS nieco komplikuje) i stwierdza, że ​​plik z hasłem mówi, że mój katalog domowy to /u/jleffler i zmienia się w tym katalogu.

Denerwujące jest to, że większość oprogramowania zachowuje się jak wyżej (a specyfikacja POSIX dla powłoki wymaga takiego zachowania). Używam oprogramowania (i nie mam zbyt wielkiego wyboru, aby go użyć), które traktuje informacje z pliku haseł jako aktualną wartość $ HOME, co jest błędne.

Stosując to do pytania - jak inni zwrócili uwagę, „cd ~x” idzie do katalogu domowego użytkownika „x”, a bardziej ogólnie, gdy tyldy jest zrobione, ~x oznacza katalog domowy użytkownika „x” (i jest błędem, jeśli użytkownik "x" nie istnieje).


Może warto wspomnieć, że:

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

nie mogę natychmiast znaleźć zastosowanie dla „~+”, chyba że robisz jakieś dziwne rzeczy z ruchomymi dowiązania na ścieżce prowadzącej do prądu informator.

Można również zrobić:

cd - 

Oznacza to, że tak samo jak ~-.

+1

Informacje o 'cd ~ +': możesz go użyć do sprawdzenia, czy katalog, w którym aktualnie się znajdujesz, nadal istnieje - nawet jeśli jest to dość niekonwencjonalny sposób. – professorsloth

56

Jest to cecha Bash zwany "tilde expansion". Jest to funkcja powłoki, a nie systemu operacyjnego. Na przykład otrzymasz inne zachowanie za pomocą csh.

Aby odpowiedzieć 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ą wyciągane z /etc/passwd, choć można je skonfigurować do pobierania informacji przy użyciu dowolnego pożądanego źródła, takiego jak NIS, LDAP lub baza danych SQL.

Rozszerzenie tyldy to coś więcej niż wyszukiwanie katalogu domowego. Oto podsumowanie:

~    $HOME 
~fred   (freds home dir) 

~+    $PWD (same effect as ./) 
~-    $OLDPWD (your previous directory) 
~1    `dirs +1` 
~2    `dirs +2` 
~-1   `dirs -1` 

dirs i ~1, ~-1 itp, są używane w połączeniu z pushd i popd.

+0

jako notatka [tag: fish] nie obsługuje żadnego z nich oprócz zwykłej tyldy (~) – Chinggis6

+0

, dlaczego wymyślili '~ +'? wydaje się raczej bezużyteczny. – cregox

+1

~ + jest mniej więcej taki sam jak. Jednakże, aby użyć czegoś takiego jak plik ./file, trzeba przejść do systemu plików i dowiedzieć się, gdzie. znajduje się - wymaga kilku cykli. Użycie ~ + zapisuje pracę poprzez zwrócenie zawartości zmiennej powłoki PWD, która jest już zdefiniowana podczas przechodzenia przez system plików. – SDsolar

1

Jeśli używasz autofs, to rozszerzenie może faktycznie pochodzić z /etc/auto.home (lub podobnej dla twojej dystrybucji). Na przykład, mój /etc/auto.master wygląda następująco:

/home2 auto.home --timeout 60 

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

mgalgs -rw,noquota,intr space:/space/mgalgs 
0

Możliwe widzisz użytkowników OpenDirectory/ActiveDirectory/LDAP "montowana" w swoim katalogu domowym.

W * nix, ~ rozwiąże się Twój katalog domowy. Podobnie ~X rozwiąże "użytkownika X".

Podobnie jak w przypadku automatycznych katalogów, katalog OpenDirectory/ActiveDirectory/LDAP jest używany w większych/korporacyjnych środowiskach do automatyzowania katalogów użytkowników. Użytkownicy ci mogą być rzeczywistymi osobami lub mogą być kontami komputerów utworzonymi w celu zapewnienia różnych funkcji.

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

Powiązane problemy