W przypadku csh
i tcsh
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:
$ (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ść $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:
$ 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 $USER
pliku, 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 ''