2

Установка переменной USERNAME не имеет никакого эффекта. Доступ к переменной всегда возвращает текущего зарегистрированного пользователя.

james@localhost:~$ USERNAME=foo
james@localhost:~$ echo $USERNAME
james

Я не смог найти никаких ссылок или документов, объясняющих это поведение. Кажется, что $ USERNAME - это какая-то особая переменная. Есть ли другие? Где это задокументировано или объяснено?

2 ответа2

1

Кажется, вы используете Z Shell, по крайней мере описываемое вами поведение воспроизводимо там:

zsh$ echo $USERNAME
user1
zsh$ USERNAME=test
zsh$ echo $USERNAME
user1
zsh$ 

Справочная страница зшпарам дает причину:

ИМЯ ПОЛЬЗОВАТЕЛЯ Имя пользователя, соответствующее реальному идентификатору пользователя процесса оболочки. Если у вас есть достаточные права, вы можете изменить имя пользователя (а также идентификатор пользователя и идентификатор группы) оболочки, назначив этому параметру. Также (при условии наличия достаточных привилегий) вы можете запустить одну команду под другим именем пользователя (и идентификатором пользователя, и идентификатором группы) с помощью `(USERNAME = username; command) '

Таким образом, с достаточными правами, например, от имени root, это работает, но только если user1 является действительным именем пользователя:

su
zsh# echo $USERNAME
root
zsh# USERNAME=user1
zsh#  echo $USERNAME
user1
zsh# id
uid=1001(user1) gid=1000(users)   
groups=1000(users),...

И да, есть и другие специальные переменные, обратите внимание на маркировку <S> в man zshparam , но приведу лишь несколько примеров:

  • $? статус выхода, возвращаемый последней командой
  • $$ идентификатор процесса этой оболочки
  • $EGID эффективный идентификатор группы процесса оболочки
  • $SECONDS количество секунд с момента вызова оболочки
0

ПОЛЬЗОВАТЕЛЬ и ИМЯ ИМЕНИ адресованы на man-странице envron(7). login(1) - это процесс, который устанавливает эти переменные.

переменные USER и LOGNAME могут быть изменены, и при последующем доступе будет возвращено новое значение.

нигде не найти ссылку для USERNAME, и эта переменная не установлена в bash4.3. bash определяет числовую переменную UID только для чтения. попытка изменить эту переменную в bash не удалась.

На man-странице linux написано, что USER «используется некоторыми производными от BSD программами, а LOGNAME» используется некоторыми производными от System-V программами », а на apple-man-странице заявка USER устарела.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .