W przypadku cshi tcshzapisuje wartość $HOMEzmiennej w momencie uruchomienia powłoki ( w jej $homezmiennej, jak zauważył @JdeBP ).
Jeśli rozbroisz to przed rozpoczęciem csh, zobaczysz coś takiego:
$ (unset HOME; csh -c cd)
cd: No home directory.
W przypadku bash(i większości innych powłok podobnych do Bourne'a) widzę inne zachowanie niż twoje.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
Zawartość $HOMEzmiennej 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 $HOMEjuż 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:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
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 $USERpliku, getpwuid()jeśli istnieje, lub wykonać polecenie, jeśli nie:
$ env -u HOME USER=bin ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwnam("bin") = 0x7fd2beba3d80
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
fish: Unable to create a configuration directory for fish. Your personal settings will not be saved. Please set the $XDG_CONFIG_HOME variable to a directory
where the current user has write access.
--- SIGCHLD (Child exited) ---
/bin
+++ exited (status 0) +++
$ env -u HOME -u USER ltrace -e getpw\* fish -c 'cd;pwd'
fish->getpwuid(1000, 0x7f529eb4fb28, 0x12d8790, 0x7f529e858697) = 0x7f529eb51dc0
fish->getpwnam("chazelas") = 0x7f529eb51d80
--- SIGCHLD (Child exited) ---
--- SIGCHLD (Child exited) ---
/home/chazelas
+++ exited (status 0) +++
SEGV, gdy użytkownik nie istnieje ( https://github.com/fish-shell/fish-shell/issues/3599 ):
$ env -u HOME USER=foo fish -c ''
zsh: segmentation fault env -u HOME USER=foo fish -c ''