设置变量 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$EGID
shell 进程的有效组 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 已被弃用。