У Вас есть ответ на связанном ТАК вопрос, на который указывает jw013, для extX, на размонтированном диске:
# Update ctime
debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1
# Drop vm cache so ctime update is reflected
echo 2 > /proc/sys/vm/drop_caches
Это - вход в систему.
Вход в систему Linux (1) страница справочника говорит:
Значение за $HOME, $USER, $SHELL, $PATH, $LOGNAME и $MAIL установлено согласно соответствующим полям во вводе пароля.
Вход в систему FreeBSD (1) страница справочника говорит:
Утилита входа в систему вводит информацию в среду (см., окружают (7)), определение корневого каталога пользователя (ДОМОЙ), интерпретатор команд (SHELL), путь поиска (ПУТЬ), терминальный тип (ТЕРМИН) и имя пользователя (и LOGNAME и ПОЛЬЗОВАТЕЛЬ).
NetBSD, OpenBSD и страницы справочника OS X заявляют то же самое.
Вот исходный код от входа в систему util-linux:
setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
/* ... */
setenv("LOGNAME", pwd->pw_name, 1);
Вот исходный код от входа в систему FreeBSD:
(void)setenv("LOGNAME", username, 1);
(void)setenv("USER", username, 1);
(void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);
Нет никакого правила. Некоторые оболочки как tcsh
или zsh
набор $LOGNAME
. zsh
наборы $USER
.
Это может быть установлено некоторыми вещами, которые регистрируют Вас в подобном login
(как вызвано getty
когда вход в систему на терминале и иногда другими вещами как in.rlogind
), cron
, su
, sudo
, sshd
, rshd
, графические менеджеры по входу в систему или не могут.
Если был вход в систему хотя, по моему опыту, $USER
обычно устанавливается (но это не может быть обновлено после изменения идентификатора пользователя (через команды setuid) в рамках той сессии входа в систему. POSIX требует этого $LOGNAME
будьте установлены после входа в систему (и cron
).
Для получения имени для входа в систему портативно, лучше всего должен использовать logname
команда (если не было никакого входа в систему, она ничего не может возвратить). Для получения идентификатора пользователя использовать id -u
. Получить одно имя пользователя, соответствующее текущему эффективному идентификатору пользователя: id -un
. Для получения всех их (большую часть времени существует только одно имя пользователя на идентификатор пользователя, но это не гарантируется):
perl -le 'while ($n = getpwent()) {print $n if getpwnam($n) == $>}'
Хотя это не может работать над системами, где пользовательская база данных не может быть перечислена (как это иногда происходит с сетевыми пользовательскими базами данных, например).
Если вы хотите использовать переменные среды (вместо whoami
или getpwent
иgetpwnam
)и не уверены, всегда ли они установлены одинаково во всех *системах NIX, попробуйте это в баш:
THIS_USER=${USER:-${USERNAME:-${LOGNAME}}}
echo ${THIS_USER}
Если после всего этого он по-прежнему пуст, то вы находитесь в довольно эзотерической системе. ;)
USER
иUSERNAME
набор и Ваша команда только возвращаютсяLOGNAME
. – Joseph R. 19.05.2013, 14:50login
кажется, не единственная вещь, устанавливающая эти переменные. – Joseph R. 19.05.2013, 17:10login
команда. Ose, которые используют Linux в качестве их ядра, свободны использовать любую реализацию, которую они любят. Например, Debian базировался, системы имеют тенденцию использовать ту от тени-utils, не util-linux. – Stéphane Chazelas 07.01.2017, 11:34login
часто не вызывается при входе в системуssh
или большинством графических менеджеров по входу в систему. – Stéphane Chazelas 07.01.2017, 11:35