Если я запускаю echo $XDG_CURRENT_DESKTOP
и sudo echo $XDG_CURRENT_DESKTOP
в Ubuntu, я получаю 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
Потому что ваше 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
.
другой gotcha с переменными окружения не копирует их в среду суперпользователя (и поэтому их значение будет равно null
):
Используйте флаг -E
чтобы сделать это
sudo -E <command>
-E
. Любой способ решить это с Java? Кстати, это программа установки.