Chapter 8 of POSIX standard定义了常用环境变量列表"它们经常被广泛使用的命令解释器和应用程序导出"。
但是我找不到任何在我的类Unix系统中提供名字的C头。
我正在寻找类似的东西:
#define ENV_PATH "PATH"
#define ENV_USER "USER"
#define ENV_IFS "IFS"
...
哪里可以找到这样的标题?任何特定于操作系统的标题都可行:我不想自己为常量创建名称。
修改
如果您习惯于只使用主流操作系统,您可能会问:为什么要在此处使用常量? $ PATH到处都是$ PATH!
事实并非如此。
在Plan 9 from Bell Labs中,环境变量通常是小写的(显然是由于aesthetics)。
在Jehanne,由Plan 9派生的新操作系统中,我重新考虑了这种设计选择,以简化POSIX工具的集成。但是,由于我喜欢小写的环境变量,所以当Jehanne成为真正的操作系统时,我希望能够轻松切换回小写名称。 :-D
答案 0 :(得分:2)
如评论中所述,没有头文件提供应用程序和实用程序使用的任何POSIX指定的环境变量列表。
“广泛使用的命令解释器和应用程序经常导出的某些变量”的列表“can be found at http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08。 (实际的环境变量列表需要重新格式化,但无论如何......)
与经常发生的某些变量发生冲突是不明智的 通过广泛使用的命令解释器和应用程序导出:
ARFLAGS IFS MAILPATH PS1 CC LANG MAILRC PS2 CDPATH LC_ALL MAKEFLAGS PS3 CFLAGS LC_COLLATE MAKESHELL PS4 CHARSET LC_CTYPE MANPATH PWD COLUMNS LC_MESSAGES MBOX RANDOM DATEMSK LC_MONETARY MORE SECONDS DEAD LC_NUMERIC MSGVERB SHELL EDITOR LC_TIME NLSPATH TERM ENV LDFLAGS NPROC TERMCAP EXINIT LEX OLDPWD TERMINFO FC LFLAGS OPTARG TMPDIR FCEDIT LINENO OPTERR TZ FFLAGS LINES OPTIND USER GET LISTER PAGER VISUAL GFLAGS LOGNAME PATH YACC HISTFILE LPDEST PPID YFLAGS HISTORY MAIL PRINTER HISTSIZE MAILCHECK PROCLANG HOME MAILER PROJECTDIR
要访问环境变量use the getenv()
function。
exec()
function documentation指定char **environ
变量:
另外,以下变量必须由声明声明 用户是否直接使用:
extern char **environ;
被初始化为指向一个字符指针数组的指针 环境字符串。 argv和environ数组均已终止 由空指针。 。终止
argv
数组的空指针不计入argc
。应用程序可以在一次操作中更改整个环境 通过指定
environ
变量指向一个字符数组 指向新环境字符串的指针。分配新值后 到environ
,应用程序不应该依赖于新环境 字符串仍然是环境的一部分,作为对getenv()
的调用,putenv()
,setenv()
,unsetenv()
或 任何依赖于环境变量的函数都可以打开 注意到environ
已更改,请将环境字符串复制到a 新数组并指定environ
指向它。任何直接修改指针的应用程序
environ
个变量点具有未定义的行为。符合多线程应用程序不得使用
environ
变量来访问或修改任何其他环境变量 线程同时修改任何环境变量。打电话给 任何依赖于任何环境变量的函数都应该被考虑 使用environ
变量来访问该环境变量。
答案 1 :(得分:-1)
你可以做类似的事情,在get_env_variables函数中你可以修改你想要的东西。只需创建类似strncmp函数的内容,以便检查是否要修改此变量。
int main(int ac, char **av, char **env){
int i = 0;
while (env[i] != NULL){
env[i] = get_env_variables(env[i]);
i++;
}
}
char *get_env_variables(char *str) {
// PUT SOME CODE HERE
}
编辑:不要忘记返回新的环境[i]。