C getenv()Linux/Ubuntu返回NULL

C getenv()Linux/Ubuntu返回NULL,c,linux,unix,ubuntu-12.04,C,Linux,Unix,Ubuntu 12.04,我试图使用getenv(“$home”)获取用户主目录,但它返回NULL。我做错了什么 int main(void) { char * path; path = getenv("$HOME"); printf ("The current path is: %s",path); return 0; } 并且,还可以选择使用-Wall编译,最终得到类似的结果。(测试…) #包括 #包括 内部主(空){ 字符*路径; path=getenv(“path”); 如果(

我试图使用
getenv(“$home”)
获取用户主目录,但它返回NULL。我做错了什么

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

    return 0;
}
并且,还可以选择使用
-Wall
编译,最终得到类似的结果。(测试…)

#包括
#包括
内部主(空){
字符*路径;
path=getenv(“path”);
如果(路径)
printf(“当前路径为:%s\n”,路径);
返回0;
}

不应该是
getenv(“PATH”)

$
保留在环境变量名称之外。当在shell中使用时,
$
不是名称的一部分,而是向shell发出信号,表示后面有一个变量名,它应该替换它的值。

对于主目录,可以使用

char* homedir = getenv("HOME");
char* homedir = NULL;
struct passwd *pw = getpwuid(getuid());
if (pw)
   homedir = pw->pw_dir;
或者你可以用

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

对于
execvp
使用的
PATH
,请使用
getenv(“PATH”)

因为HOME是一个环境变量,所以不应在其前面加上$符号

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

确保包含了unistd.h和所有相关的头文件。

我想使用`getenv(“$HOME”)。使用您的代码,我可以按照您所说的编译“分段错误(内核转储)”。该选项被添加到Eclipse命令中。并且仍然收到“分段错误(核心转储)”如果OP想要回家,为什么要告诉OP读出路径?如果OP想要回家,为什么要告诉OP读出路径?啊,道歉。我用PATH在我的机器上试过了。应该是
getenv(“主页”)