Дочерний процесс не может напрямую устанавливать среду родительского процесса.Подход с использованием system()
и getenv()
обречен на неудачу, поэтому.
Если вы пытаетесь импортировать выбранные переменные, установленные сценарием hi.sh
тогда у вас есть пара вариантов.Либо вы можете прочитать сценарий hi.sh
и выяснить, на что он их установит (довольно сложно), либо вы можете запустить сценарий и заставить код, который вы запускаете, сообщать о переменных среды, представляющих интерес.
Предположим, что hi.sh
устанавливает $ENV1
и $ENV2
.Вы можете использовать popen()
, чтобы вернуть значения в вашу программу, и setenv()
, чтобы установить среду вашей программы.В общих чертах:
FILE *fp = popen(". ./hi.sh; echo ENV1=$ENV1; echo ENV2=$ENV2", "r");
while (fgets(buffer, sizeof(buffer), fp) != 0)
{
...split the buffer into env_name, env_value...
setenv(env_name, env_value);
}
pclose(fp);
Обратите внимание, что я включил имя переменной в отраженную информацию;это упрощает жизнь.Если ваш список переменных становится громоздким, возможно, вы запускаете ". ./hi.sh; env"
, чтобы получить всю среду, а затем читаете каждую строку и решаете из встроенного списка, хотите ли вы использовать параметр переменной, который вы хотите использовать или нет.Или вы можете просто снова настроить всю среду, если вам это нравится.Вы должны проверить, что функция setenv()
успешно выполнена (она возвращает ноль, когда она успешно)Вам также следует проверить, что popen()
был успешным (fp != 0
).В этом контексте вы, вероятно, можете использовать strtok()
для поиска =
, отделяющего имя переменной от значения;он вытесняет нулевой байт над =
, давая вам нулевое завершенное имя и нулевое завершенное значение:
char *env_name = strtok(buffer, "=");
char *env_value = buffer + strlen(env_name) + 1;
if (setenv(env_name, env_value) != 0)
...report trouble...