Getenv() Linux/Ubuntu возвращает NULL

96
3

Я пытаюсь получить домашний каталог пользователей с помощью getenv("$HOME"), но он возвращает NULL. Что я делаю неправильно?


int main(void)
{
char * path;
path = getenv("$HOME");
printf ("The current path is: %s",path);

return 0;
}

спросил(а) 2021-01-19T14:12:42+03:00 2 месяца, 3 недели назад
1
Решение
115

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

ответил(а) 2021-01-19T14:12:42+03:00 2 месяца, 3 недели назад
99

getenv("PATH"); // This is what you really want

И, факультативно, скомпилируйте с -Wall и закончите с чем-то вроде этого. (Испытано...)

#include <stdio.h>
#include <stdlib.h>

int main(void) {
char *path;
path = getenv("PATH");
if(path)
printf("The current path is: %s\n", path);
return 0;
}

ответил(а) 2021-01-19T14:12:42+03:00 2 месяца, 3 недели назад
62

Для домашнего каталога вы можете использовать


char* homedir = getenv("HOME");

или вы можете использовать


char* homedir = NULL;
struct passwd *pw = getpwuid(getuid());
if (pw)
homedir = pw->pw_dir;

Для PATH, используемого execvp, используйте getenv("PATH")

ответил(а) 2021-01-19T14:12:42+03:00 2 месяца, 3 недели назад
61

Не должно быть getenv("PATH")?

ответил(а) 2021-01-19T14:12:42+03:00 2 месяца, 3 недели назад
43

Так как HOME - это переменная среды, вы не должны префикс знака $.


char *value,name[20];
scanf("%s",name);
value=getenv(name);
if(value == NULL)
printf("Not found");
else
print("value = %s",value);

Убедитесь, что вы включили unistd.h и все соответствующие файлы заголовков.

ответил(а) 2021-01-19T14:12:42+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема