如何检查是否从 C 程序设置了环境变量
How to check if environment variable is set from C program
我目前正在编写一个程序,如果设置了环境变量,我想打印特殊输出。
例如,假设我想要环境变量"DEBUG"
。
在我的 bash 命令提示符中,我通过键入以下命令来设置 DEBUG
:
DEBUG=
然后在我的 C 程序中,我可以通过打印出 char **environ
的所有内容来验证此环境变量是否已设置。 DEBUG
确实出现在这个环境打印输出中。
但是,我不知道如何检索此环境变量以进行条件检查。我试过像这样使用函数 getenv:
getenv("DEBUG")
如果我尝试像下面这样打印输出,我会遇到段错误:
printf("get env: %s\n", getenv("DEBUG"));
我什至在一个已知的环境变量上试过这个 "HOME"
:
printf("get env: %s\n", getenv("HOME"));
仍然会产生段错误。
有没有人有检查环境变量是否从 C 程序设置的经验?我什至在提取单个环境变量时遇到问题,这使我无法这样做。
getenv
returns NULL
当未设置要求的环境变量时。因此,您的支票可能只是
if(getenv("DEBUG")) {
// DEBUG is set
} else {
// DEBUG is not set
}
注意shell和环境变量是有区别的;如果你想让一个变量出现在 shell 的子进程的环境中,你必须 export
它在 shell:
export DEBUG=some_value
或
DEBUG=some_value
export DEBUG
只说DEBUG=some_value
是不够的。
您需要确保正确声明 getenv
(和 printf
)。
对于getenv
,您需要:
#include <stdlib.h>
如果不声明,调用时很可能会出现段错误。如果你要走那么远,尝试使用它的值 returns 可能也会出现段错误。
处理未声明的函数时,就好像它们被声明为接受整数或双精度参数(取决于提供的内容),就好像它们 return 整数一样。如果 int
与指针的大小相同,那可能会起作用,但在指针为 64 位而整数仅为 32 位的常见情况下,将指针作为整数传递将导致它的一半位掉在地上,几乎无法用作指针。
始终 在编译代码时指定 -Wall
,并确保注意警告。它们很重要。
这是因为您没有包括 stdlib.h
并且编译器假设 getenv()
returns int
.
你有两个选择,你可以声明getenv()
喜欢
char *getenv(const char *);
或包括 stdlib.h
,同样适用于 printf()
,但在那种情况下 header 是 stdio.h
。
你应该启用编译器警告,在linux gcc
和clang
上都支持-Wall -Wextra -Werror
,最重要的是,-Werror
会阻止编译这种情况。
代码片段:
if(NULL == getenv("TIME_ELAPSED"))
{
putenv("TIME_ELAPSED=1");
}
我们还必须处理 putenv 的错误处理。有时它 returns
ENOMEM 不足 space 无法分配新环境。
我目前正在编写一个程序,如果设置了环境变量,我想打印特殊输出。
例如,假设我想要环境变量"DEBUG"
。
在我的 bash 命令提示符中,我通过键入以下命令来设置 DEBUG
:
DEBUG=
然后在我的 C 程序中,我可以通过打印出 char **environ
的所有内容来验证此环境变量是否已设置。 DEBUG
确实出现在这个环境打印输出中。
但是,我不知道如何检索此环境变量以进行条件检查。我试过像这样使用函数 getenv:
getenv("DEBUG")
如果我尝试像下面这样打印输出,我会遇到段错误:
printf("get env: %s\n", getenv("DEBUG"));
我什至在一个已知的环境变量上试过这个 "HOME"
:
printf("get env: %s\n", getenv("HOME"));
仍然会产生段错误。
有没有人有检查环境变量是否从 C 程序设置的经验?我什至在提取单个环境变量时遇到问题,这使我无法这样做。
getenv
returns NULL
当未设置要求的环境变量时。因此,您的支票可能只是
if(getenv("DEBUG")) {
// DEBUG is set
} else {
// DEBUG is not set
}
注意shell和环境变量是有区别的;如果你想让一个变量出现在 shell 的子进程的环境中,你必须 export
它在 shell:
export DEBUG=some_value
或
DEBUG=some_value
export DEBUG
只说DEBUG=some_value
是不够的。
您需要确保正确声明 getenv
(和 printf
)。
对于getenv
,您需要:
#include <stdlib.h>
如果不声明,调用时很可能会出现段错误。如果你要走那么远,尝试使用它的值 returns 可能也会出现段错误。
处理未声明的函数时,就好像它们被声明为接受整数或双精度参数(取决于提供的内容),就好像它们 return 整数一样。如果 int
与指针的大小相同,那可能会起作用,但在指针为 64 位而整数仅为 32 位的常见情况下,将指针作为整数传递将导致它的一半位掉在地上,几乎无法用作指针。
始终 在编译代码时指定 -Wall
,并确保注意警告。它们很重要。
这是因为您没有包括 stdlib.h
并且编译器假设 getenv()
returns int
.
你有两个选择,你可以声明getenv()
喜欢
char *getenv(const char *);
或包括 stdlib.h
,同样适用于 printf()
,但在那种情况下 header 是 stdio.h
。
你应该启用编译器警告,在linux gcc
和clang
上都支持-Wall -Wextra -Werror
,最重要的是,-Werror
会阻止编译这种情况。
代码片段:
if(NULL == getenv("TIME_ELAPSED"))
{
putenv("TIME_ELAPSED=1");
}
我们还必须处理 putenv 的错误处理。有时它 returns ENOMEM 不足 space 无法分配新环境。