У випадку csh
і tcsh
, він записує значення $HOME
змінної в момент запуску оболонки ( в її $home
змінну, як зазначає @JdeBP ).
Якщо ви вимкнете його перед запуском csh
, ви побачите щось на кшталт:
$ (unset HOME; csh -c cd)
cd: No home directory.
У bash
більшості інших снарядів, схожих на Борна, я бачу іншу поведінку, ніж ваша.
bash-4.4$ unset HOME; cd
bash: cd: HOME not set
Вміст $HOME
змінної ініціалізується процесом входу на основі інформації, що зберігається в базі даних користувача щодо вашого користувача імені .
Інформація про саме ім’я користувача не завжди доступна. Усі оболонки можуть точно знати, що це користувач процесу, який його виконує, і декілька користувачів (з різними домашніми каталогами) можуть спільно використовувати одне і те ж користувальницьке.
Отже, як тільки $HOME
він піде, немає надійного способу повернути його.
Запит на базу даних користувачів (зі getpwxxx()
стандартним API) для домашнього каталогу першого користувача, який має той самий uid, як і той, що працює з оболонкою, був би лише наближенням (не кажучи вже про те, що база даних користувачів могла змінитися (або домашня каталог визначається як значення часу) з моменту початку сеансу входу).
zsh
це єдина оболонка, про яку я знаю, що робить це:
$ env -u HOME ltrace -e getpw\* zsh -c 'cd && pwd'
zsh->getpwuid(1000, 0x496feb, 114, 0x7f9599004697) = 0x7f95992fddc0
/home/chazelas
+++ exited (status 0) +++
Усі інші оболонки, які я спробував або поскаржитися на цю невстановлену HOME, або використовувати /
як домашнє значення за замовчуванням.
І все ж інша поведінка - це fish
, що, схоже, запитує базу даних для ім'я користувача, яке зберігається, $USER
якщо воно є, або робити, getpwuid()
якщо ні:
$ 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, коли користувача не існує ( https://github.com/fish-shell/fish-shell/isissue/3599 ):
$ env -u HOME USER=foo fish -c ''
zsh: segmentation fault env -u HOME USER=foo fish -c ''