Каждая оболочка имеет переменную окружения $ HOME set (ex:) /Users/lotolo
. Если я нахожусь под csh, я могу unsetenv HOME
и все еще, если я делаю, cd
я буду в моем доме. Я проверял это также на bash ( unset HOME
), и это то же самое поведение. Так как же оболочка узнает, где находится мой / other_user дом? Где он читает эти значения?
Это не дубликат, так как мой вопрос не в том, откуда я знаю, а в том, как оболочка узнает HOME
. И это поведение распространяется и на других пользователей.
/etc/passwd
. Некоторые системы могут хранить эту информацию на серверах LDAP, NIS и т. Д.getpwuid(3)
или аналогичны. Некоторые системы могут быть настроены на «перенаправление»getpwuid(3)
для получения информации из/etc/passwd
LDAP, NIS, NIS + и т. Д.Ответы:
В случае
csh
иtcsh
он записывает значение$HOME
переменной во время запуска оболочки ( в ее$home
переменной, как отмечено @JdeBP ).Если вы отключите его перед запуском
csh
, вы увидите что-то вроде:Для
bash
(и большинства других подобных Борну оболочек) я вижу поведение, отличное от вашего.Содержимое
$HOME
переменной инициализируется процессом входа в систему на основе информации, хранящейся в базе данных пользователей, относительно вашего имени пользователя .Информация о самом имени пользователя не всегда доступна. Оболочка может знать наверняка только идентификатор пользователя процесса, который ее выполняет, и несколько пользователей (с разными домашними каталогами) могут использовать один и тот же идентификатор пользователя.
Таким образом, после того,
$HOME
как ушел, нет надежного способа вернуть его.Запрос к базе данных пользователей (со
getpwxxx()
стандартным API) для домашнего каталога первого пользователя, который имеет тот же uid, что и тот, в котором запущена оболочка, будет лишь приблизительным (не говоря уже о том, что база данных пользователей могла измениться (или домашний каталог). каталог определяется как одноразовое значение) с момента начала сеанса входа в систему).zsh
единственная известная мне оболочка, которая делает это:Все остальные оболочки, которые я пробовал, либо жалуются на этот неустановленный HOME, либо используют
/
в качестве домашнего значения по умолчанию.И все же другое поведение - это
fish
's', который, кажется, запрашивает в базе данных имя пользователя, сохраненное,$USER
если оно есть, или делает,getpwuid()
если нет:SEGV, когда пользователь не существует ( https://github.com/fish-shell/fish-shell/issues/3599 ):
источник
fish
разработкой с разработчиком, чтобы увидеть, есть ли ошибка. Редактировать. Да, это.PATH
?TERM
?USER
?Querying the user database
...would only be...
не совсем понятноЭто не так. Вы просто не проводите эксперимент должным образом. Как видно из руководства по оболочке C,
cd
команда меняется на значениеhome
переменной, если она указана без аргументов. Если эта переменная не установлена, она не знает, где изменить каталог и выводит ошибку:Вы сбросили неправильную переменную. Это не
HOME
переменная окружения, этоhome
внутренняя переменная оболочки C (инициализируется из значения первого при запуске оболочки, но в остальном независимая переменная сама по себе).источник
csh
но, по-видимому, это псевдонимtcsh
Система установила переменную HOME во время входа в систему в качестве пути к домашнему каталогу пользователя. Это установлено
Вы можете изменить его значение, но обратите внимание, потому что .bashrc, .profile, .xinitrc и т. Д. Не будут прочитаны, если они не находятся в домашнем каталоге.
источник
usermod -d HOME_DIR
команды, когда создается новый пользователь. по умолчанию home - это / home / $ username и определяется программой входа в систему.