设置变量 $USERNAME 无效

设置变量 $USERNAME 无效

设置变量 USERNAME 无效。访问该变量始终返回当前登录的用户。

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

我找不到任何参考资料或文档来解释这种行为。似乎 $USERNAME 是某种特殊变量。还有其他变量吗?在哪里有记录或解释?

答案1

看来你正在使用壳牌,至少你所描述的行为可以在那里重现:

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

手册页参数给出原因:

用户名 与 shell 进程的实际用户 ID 对应的用户名。如果您有足够的权限,您可以通过指定此参数来更改 shell 的用户名(以及用户 ID 和组 ID)。此外(假设有足够的权限),您可以通过 `(USERNAME=username; command)' 以不同的用户名(以及用户 ID 和组 ID)启动单个命令

因此,如果具有足够的权限,例如这有效,但前提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,仅举几个例子:

  • $?最后一个命令返回的退出状态
  • $$此 shell 的进程 ID
  • $EGIDshell 进程的有效组 ID
  • $SECONDS自 shell 调用以来的秒数

答案2

USER 和 LOGNAME 在 envron(7) 手册页中说明。login(1) 是设置这些变量的进程

USER 和 LOGNAME 变量都可以修改,并且以后访问时会返回新值。

在任何地方都找不到 USERNAME 的引用,并且此变量未在 bash4.3 中设置。bash 定义了一个 UID 只读数值变量。尝试在 bash 中更改此变量失败。

Linux 手册页说 USER “被一些 BSD 衍生程序使用”,而 LOGNAME “被一些 System-V 衍生程序使用”,并且苹果手册页声明 USER 已被弃用。

相关内容