Есть ли способ установить переменные окружения в Linux с помощью C?
Я пробовал setenv ()
и putenv ()
, но, похоже, они не работают для меня.
Я собираюсь сделать здесь безумное предположение, но обычная причина того, что эти функции не работают, заключается не в том, что они не работают, а в том, что пользователь на самом деле не понимает, как работают переменные среды. Например, если у меня есть эта программа:
int main(int argc, char **argv)
{
putenv("SomeVariable=SomeValue");
return 0;
}
И затем я запускаю ее из оболочки, она не будет изменять среду оболочки - у дочернего процесса нет возможности сделать это. Вот почему команды оболочки, которые изменяют среду, являются встроенными, и почему вам нужно исходный
сценарий, который содержит настройки переменных, которые вы хотите добавить в свою оболочку, а не просто запускать его.
Любая программа UNIX выполняется в отдельном процессе от процесса, который ее запускает; это «дочерний» процесс.
Когда программа запускается - будь то из командной строки или любым другим способом - система создает новый процесс, который является (более или менее) копией родительского процесса. Эта копия включает переменные среды в родительский процесс, и это механизм, с помощью которого дочерний процесс «наследует» переменные среды своего родительского процесса. (это все, в основном, то, что здесь сказали другие ответы)
То есть, только процесс когда-либо устанавливает свои собственные переменные среды.
Другие упоминали получение сценария оболочки как способ установки переменных среды в текущем процессе, но если вам нужно программно установить переменные в текущем процессе (оболочке), то это возможно косвенно.
Примите во внимание следующее:
% cat envs.c
#include <stdio.h>
int main(int argc, char**argv)
{
int i;
for (i=1; i<argc; i++) {
printf("ENV%d=%s\n", i, argv[i]);
}
}
% echo $ENV1
% ./envs one two
ENV1=one
ENV2=two
% eval `./envs one two`
% echo $ENV1
one
%
Встроенный eval
оценивает свой аргумент, как если бы этот аргумент был введен в приглашении оболочки.Это пример в стиле sh; вариант в стиле csh оставлен как упражнение!
Переменная среды, заданная с помощью setenv () / putenv (), будет установлена для процесса, который выполнил эти функции, и будет унаследована запущенными ею процессами. Однако он не будет транслироваться в оболочку, которая выполняла вашу программу.
Блок среды является локальным для процесса и копируется в дочерние процессы. Таким образом, если вы меняете переменные, новое значение влияет только на ваш процесс и дочерние процессы, порожденные после изменения. Конечно, это не изменит оболочку, из которой вы запустили.