Репликация команды `export` в jar для установки переменной окружения - PullRequest
0 голосов
/ 16 апреля 2019

Сценарий

При выполнении серии команд с использованием ProcessBuilder я заметил, что в настоящее время я не могу установить переменную среды так, чтобы она оставалась "известной" после наборакоманды были выполнены.

Вопрос

Как воссоздать эффекты * команды export TASKDDATA=/var/taskd в файле .jar?

Попытка 0

Переменная среды ProcessBuilder в java Предоставляет способ установки переменной среды для каждой конкретной команды, но когда я выполняю .jar этого решения ипроверить, если переменная окружения $u все еще установлена ​​после выполнения, я считаю, что это не так.Принимая во внимание, что $TASKDDATA остается установленным после выполнения.Для иллюстрации:

a@DESKTOP-desktopName:/mnt/e$ echo $TASKDDATA

a@DESKTOP-desktopName:/mnt/e$ TASKDDATA=/var/taskd
a@DESKTOP-desktopName:/mnt/e$ echo $TASKDDATA
/var/taskd
a@DESKTOP-desktopName:/mnt/e$ sudo java -jar autoInstallTaskwarrior.jar
[sudo] password for a:
Process ended with rc=0

Standard Output:

util/


Standard Error:


a@DESKTOP-desktopName:/mnt/e$ echo $TASKDDATA
/var/taskd
a@DESKTOP-desktopName:/mnt/e$ echo $u

Попытка 1

Для одной команды переменная среды может использовать решение, которое я написал в: Java ProcessBuilder, как получитьдвоичный вывод команды .Однако это не сохраняет переменную задачи для второй команды, в которой ее необходимо установить снова.Тем не менее, когда используется команда экспорта, переменную среды не требуется устанавливать заново.В частности, это различие выявляется, когда код Java завершен, и пользователь хочет ввести любые дополнительные команды, которые требуют переменную среды.В этом случае пользователь должен сначала снова ввести команду экспорта.

Попытка 2

Дополнительное различие возникает, когда открывается новая оболочка для получения привилегий root сsudo -s.Установка окружения в файле .jar требует не только повторной установки для каждой отдельной команды, но и переменная среды не передается в новую оболочку с привилегиями пользователя root.Например, выполнение следующих команд:

commandLines[53] = new String[4];
commandLines[53][0] = "sudo";
commandLines[53][1] = "-s";
commandLines[53][2] = "taskdctl"; 
commandLines[53][3] = "start";
commands[53].setCommandLines(commandLines[53]);
commands[53].setEnvVarContent("/var/taskd");
commands[53].setEnvVarName("TASKDDATA");
commands[53].setWorkingPath("/usr/share/taskd/pki");

commandLines[54] = new String[5];
commandLines[54][0] = "sudo";
commandLines[54][1] = "-s";
commandLines[54][2] = "task"; 
commandLines[54][3] = "sync";
commandLines[54][4] = "init";
commands[54].setCommandLines(commandLines[54]);
commands[54].setEnvVarContent("/var/taskd");
commands[54].setEnvVarName("TASKDDATA");
commands[54].setWorkingPath("/usr/share/taskd/pki");

возвращает:

53RUNNINGCOMMAND=sudo -s taskdctl start
The TASKDDATA variable must be set.

54RUNNINGCOMMAND=sudo -s task sync
Could not connect to 0.0.0.0 53589
Sync failed.  Could not connect to the Taskserver.
Syncing with 0.0.0.0:53589

Примечание 1

Установка переменной среды $TASKDDATA=/var/taskd перед выполнением.jar с: TASKDDATA=/var/taskd sudo java -jar autoInstallTaskwarrior.jar не гарантирует, что переменная среды $TASKDDATA останется доступной после выполнения файла .jar.Кроме того, это выходит за рамки вопроса, так как он установлен не в файле .jar, а вне файла .jar.

Note 2

Я понялНеверно использовать команду export в качестве команды, выполняемой построителем процессов, во многом как команда cd.

* Вот почему вопрос сосредоточен на воспроизведении «долгосрочного / длительного» эффекта / доступности установки переменной среды, а не на «как выполнить команду экспорта».

1 Ответ

1 голос
/ 17 апреля 2019

когда я выполняю .jar этого решения и проверяю, установлена ​​ли переменная среды $ u после выполнения, я обнаружил, что это не так.

Это ожидаемое поведение.Некоторые операционные системы поддерживают концепцию глобальных переменных среды.Но не UNIX.В UNIX-подобных операционных системах каждый процесс имеет свою собственную частную копию переменных среды.Процесс не может изменить среду другого процесса.Вот почему изменение текущего рабочего каталога в процессе не приводит к изменению cwd его родительского процесса.Каждый процесс имеет свой собственный cwd.

Обычный способ обойти это ограничение - дочерний процесс записывает пары var = val в stdout, а родительская оболочка затем оценивает этот вывод, чтобы установить переменные в своей среде.Для иллюстрации предположим, что команда представляет собой следующий сценарий оболочки с именем myscript.sh , а не Java-программу:

#!/bin/sh
echo VAR_A=val_a
echo VAR_B=val_b

Тогда родительская оболочка выполняет

export $(./myscript.sh)
...