超级用户时,System.getenv()返回null

时间:2015-04-08 09:28:51

标签: java linux ubuntu

如果我在Ubuntu中运行echo $XDG_CURRENT_DESKTOPsudo echo $XDG_CURRENT_DESKTOP,我会在两种情况下都获得Unity。如果我在Java中编写System.getenv("XDG_CURRENT_DESKTOP"),当我运行没有超级用户权限的程序时它返回Unity但是当我使用null运行它时返回sudo。这是怎么回事?

public class GetEnv {
        public static void main(String[] args) {
                System.out.println(System.getenv("XDG_CURRENT_DESKTOP"));
        }
}

这是输出:

$ echo $XDG_CURRENT_DESKTOP
$ Unity
$ sudo echo $XDG_CURRENT_DESKTOP
$ Unity
$ javac GetEnv.java
$ java GetEnv
$ Unity
$ sudo java GetEnv
$ null

2 个答案:

答案 0 :(得分:3)

因为sudo错误。

sudo echo $XDG_CURRENT_DESKTOP

将扩展为

sudo echo Unity

在以root身份执行之前。

如果要保留运行sudo的用户的设置,则需要定义应在sudo配置中保留的环境变量。

Defaults:suboptimal    env_keep += "XGD_CURRENT_DESKTOP", !requiretty
suboptimal    your_host=NOPASSWD: /user/bin/java

然后您可以将命令作为

运行
sudo java GetEnv

应该显示主叫用户的设置。在您的情况下Unity

答案 1 :(得分:2)

环境变量的另一个问题是没有将它们复制到超级用户的环境中(因此它们的值将是null):

使用-E标志执行此操作

sudo -E <command>