无法更改环境变量

Ric*_*ani 4 osx zsh environment-variables

我在用什么

  • zsh
  • MacOS 莫哈韦沙漠 14.10

我想做的事

$ echo $USERNAME
myusername
$ export USERNAME=newvalue
$ echo $USERNAME
newvalue
Run Code Online (Sandbox Code Playgroud)

怎么了

$ echo $USERNAME
myusername
$ export USERNAME=newvalue
$ echo $USERNAME
myusername
Run Code Online (Sandbox Code Playgroud)

我的尝试

试图USERNAME.bashrc, 中设置,.zshrc.profile没有任何变化......

尝试unset并重置,但没有任何改变......

Jde*_*eBP 12

USERNAMEshell变量是在Z shell特殊。

它始终是 shell 进程的用户 ID 的帐户名。

您不会观察到您在 Almquist、Watanabe、Korn 或 Bourne Again shell 中观察到的行为。这个变量只是一个普通的 shell 变量,就他们而言,它开始时未设置。例如,这里是 93 Korn shell:

$ echo $USERNAME

$ USERNAME=wibble
$ echo $USERNAME
颤抖
$

在 Z shell 中,它以 shell 进程的 UID 的帐户名开头。尝试设置它将尝试更改该 UID。如果您不是超级用户,这当然会失败,并且将变量保留为以前的状态。

但是,如果您以超级用户身份运行 Z shell,您就会看到USERNAMEshell 变量和 shell 进程的用户 ID 都发生了变化。

root # echo $USERNAME
根
根 # 用户名=JdeBP
JdeBP %

进一步阅读

  • @RiccardoPersiani 嗯……切换到 root 不是一个“解决方案”。_Why_ 你需要改变这个变量的值吗? (2认同)
  • 请注意,一个用户 id 可以有多个用户名,`zsh` 报告由 `getpwuid()` 返回的用户名,因此是任意一个(有人可能认为它应该使用 `logname()` 代替)。更改`$USERNAME` 会执行`setuid()`,但也会执行`setgid()`/`setgroups()` 与用户数据库中提到的组,当您以该用户名登录时,这与设置`$ 不同例如 UID` 或 `$EUID`。因此,如果当前 uid 有多个具有不同组成员身份的用户名,那么通过执行 `USERNAME=$USERNAME`,您可能会很可能更改进程的组列表。 (2认同)