Każda powłoka ma ustawioną zmienną środowiskową $ HOME (np .:) /Users/lotolo
. Jeśli mam csh, mogę, unsetenv HOME
a jeśli tak, to cd
będę w domu. Przetestowałem to również na bash ( unset HOME
) i to samo zachowanie. Skąd więc powłoka wie, gdzie jest mój dom / other_user? Gdzie odczytuje te wartości?
To nie jest duplikatem ponieważ moje pytanie nie brzmi, jak ja wiem, ale jak robi się powłoki know- HOME
. To zachowanie obejmuje także innych użytkowników.
/etc/passwd
. Niektóre systemy mogą przechowywać te informacje w LDAP, serwerach NIS itp.getpwuid(3)
lub podobnie. Niektóre systemy można skonfigurować do „zmiany trasy” wgetpwuid(3)
celu pobierania informacji z/etc/passwd
LDAP, NIS, NIS + itp.Odpowiedzi:
W przypadku
csh
itcsh
zapisuje wartość$HOME
zmiennej w momencie uruchomienia powłoki ( w jej$home
zmiennej, jak zauważył @JdeBP ).Jeśli rozbroisz to przed rozpoczęciem
csh
, zobaczysz coś takiego:W przypadku
bash
(i większości innych powłok podobnych do Bourne'a) widzę inne zachowanie niż twoje.Zawartość
$HOME
zmiennej jest inicjowana przez proces logowania na podstawie informacji przechowywanych w bazie danych użytkowników w stosunku do nazwy użytkownika .Informacje o samej nazwie użytkownika nie zawsze są dostępne. Jedyną powłoką, którą z pewnością wie, jest identyfikator użytkownika procesu, który ją wykonuje, a kilku użytkowników (z różnymi katalogami domowymi) może współdzielić ten sam identyfikator użytkownika.
Więc kiedy
$HOME
już zniknie, nie ma niezawodnego sposobu na odzyskanie go.Zapytanie bazy danych użytkownika (ze
getpwxxx()
standardowym interfejsem API) dla katalogu głównego pierwszego użytkownika, który ma taki sam identyfikator użytkownika, jak ten, w którym uruchomiona jest powłoka, stanowiłoby jedynie przybliżenie (nie wspominając o tym, że baza danych użytkowników mogła ulec zmianie (lub strona główna) katalog jest definiowany jako wartość jednorazowa) od rozpoczęcia sesji logowania).zsh
to jedyna znana mi powłoka, która to robi:Wszystkie inne powłoki, które próbowałem albo narzekać na ten rozbrojony HOME lub użyć
/
jako domyślnej wartości home.Jednak zachowuje się inne zachowanie
fish
, które wydaje się pytać bazę danych o nazwę użytkownika zapisaną w$USER
pliku,getpwuid()
jeśli istnieje, lub wykonać polecenie, jeśli nie:SEGV, gdy użytkownik nie istnieje ( https://github.com/fish-shell/fish-shell/issues/3599 ):
źródło
fish
głową dewelopera, aby sprawdzić, czy błąd też tam jest. Edytować. Tak to jest.PATH
?TERM
?USER
?Querying the user database
...would only be...
rzeczywiście nie tak jasneNie ma Po prostu źle przeprowadzasz eksperyment. Jak widać z podręcznika powłoki C,
cd
polecenie zmienia się na wartośćhome
zmiennej, jeśli zostanie podana bez argumentów. Jeśli ta zmienna nie jest ustawiona, nie wie, gdzie zmienić katalog i wyświetla błąd:Usuwasz niewłaściwą zmienną. Nie jest to
HOME
zmienna środowiskowa, tohome
zmienna wewnętrzna powłoki C (inicjowana z wartości poprzedniej podczas uruchamiania powłoki, ale poza tym niezależna zmienna sama w sobie).źródło
csh
tcsh
System ustawił zmienną HOME podczas logowania na ścieżkę do katalogu domowego użytkownika. Ustawia to
Możesz zmienić jego wartość, ale zwróć uwagę, ponieważ .bashrc, .profile, .xinitrc itp. Nie zostaną odczytane, jeśli nie znajdują się w katalogu domowym.
źródło
usermod -d HOME_DIR
polecenia, gdy tworzony jest nowy użytkownik. domyślna strona główna to / home / $ nazwa użytkownika i jest ona określana przez program logowania.