Установить переменные среды в C - PullRequest
31 голосов
/ 05 августа 2010

Есть ли способ установить переменные окружения в Linux с помощью C?

Я пробовал setenv() и putenv(), но они, похоже, не работают для меня.

Ответы [ 4 ]

47 голосов
/ 05 августа 2010

Я собираюсь сделать дикое предположение здесь, но обычная причина, по которой эти функции, похоже, не работают, не в том, что они не работают, а в том, что пользователь действительно не понимает, как работают переменные среды.Например, если у меня есть эта программа:

int main(int argc, char **argv)
{
  putenv("SomeVariable=SomeValue");
  return 0;
}

И затем я запускаю ее из оболочки, она не изменит среду оболочки - для дочернего процесса это невозможно.Вот почему команды оболочки, которые изменяют среду, являются встроенными, и поэтому вам нужно source сценарий, который содержит переменные параметры, которые вы хотите добавить в свою оболочку, а не просто запускать ее.

10 голосов
/ 05 августа 2010

Любая 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 оставлен в качестве упражнения!

5 голосов
/ 05 августа 2010

Переменная среды, установленная setenv () / putenv (), будет установлена ​​для процесса, который выполнил эти функции, и будет унаследована процессами, запущенными ею.Однако он не будет транслироваться в оболочку, которая выполняла вашу программу.

Почему не работает моя оболочка для setenv ()?

1 голос
/ 05 августа 2010

Блок среды является локальным для процесса и копируется в дочерние процессы. Поэтому, если вы изменяете переменные, новое значение влияет только на ваш процесс, а дочерние процессы порождаются после изменения. Конечно, это не изменит оболочку, с которой вы запустили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...