Использование функции getenv

У меня есть программа на C, которая печатает каждую переменную окружения, имя которой задается стандартным вводом. Он печатает такие переменные, как $PATH, $USER, но не видит переменные окружения, которые я сам определяю в оболочке Linux... Например, в bash я определяю my=4, и я ожидаю, что программа вернет 4, когда я введите «мой».

int main  () {
  char * key = (char * )malloc(30);

  scanf("%s", key);

  if(getenv(key) != NULL)
    printf("%s\n", getenv(key));
  else
    printf("NULL\n");

  return 0;
}

Что я могу сделать, чтобы улучшить результаты getenv? Я хочу, чтобы он показал мне все переменные окружения со всеми наследствами от оболочки Linux. Спасибо..


person shaku    schedule 23.03.2011    source источник
comment
Нет необходимости malloc блокировать фиксированную длину. Достаточно char key[30]. (Кстати, вы никогда не free блокируете.)   -  person Fred Foo    schedule 23.03.2011
comment
@larsmans: Спасибо за наблюдение, это был только поспешный пример, мне нужен был getenv в более широком контексте :)   -  person shaku    schedule 25.03.2011


Ответы (3)


Есть несколько способов:

  1. my=4; export my; ./program
  2. my=4 ./program
  3. env my=4 ./program

Каждый из этих методов имеет одинаковый эффект, но через разные механизмы.

  1. Этот метод специфичен для используемой вами оболочки, хотя он работает так же в большинстве типичных оболочек (варианты оболочки Bourne; оболочки, производные от csh, опять же отличаются). Это сначала устанавливает переменную оболочки, затем экспортирует ее в переменную среды, а затем запускает вашу программу. В некоторых оболочках вы можете использовать аббревиатуру export my=4. Переменная остается установленной после запуска вашей программы.

  2. Этот метод также зависит от вашей оболочки. Это устанавливает переменную среды my временно для этого выполнения ./program. После запуска my не существует (или имеет исходное значение).

  3. Это использует программу env для установки переменной среды перед запуском вашей программы. Этот метод не зависит от какой-либо конкретной оболочки и является наиболее переносимым. Как и метод 2, это временно устанавливает переменную среды. На самом деле, оболочка даже не знала, что установлено значение my.

person Greg Hewgill    schedule 23.03.2011
comment
+1: в 1 я рекомендую заменить большинство типичных оболочек вариантами оболочки Bourne (или всеми пригодными для использования оболочками :)) - person William Pursell; 23.03.2011

Если вы этого не сделали export, то это просто переменная оболочки, а не переменная среды. Используйте export my=4 или my=4; export my.

person geekosaur    schedule 23.03.2011

Это не имеет ничего общего с C или getenv. Если вы делаете my=4 в оболочке, вы определили локальную переменную оболочки. Чтобы сделать это переменной среды, выполните export my.

person Fred Foo    schedule 23.03.2011