哪个C头定义了通用变量名(PATH、HOME、IFS?
定义“由广泛使用的命令解释器和应用程序经常导出”的常用环境变量列表 但是,在我的任何类unix系统中,我都找不到任何提供名称的C头 我要找的东西是:哪个C头定义了通用变量名(PATH、HOME、IFS?,c,environment-variables,posix,C,Environment Variables,Posix,定义“由广泛使用的命令解释器和应用程序经常导出”的常用环境变量列表 但是,在我的任何类unix系统中,我都找不到任何提供名称的C头 我要找的东西是: #define ENV_PATH "PATH" #define ENV_USER "USER" #define ENV_IFS "IFS" ... 在哪里可以找到这样的标题?任何特定于操作系统的头文件都可以工作:我只是不想自己为常量发明名称 编辑 如果您习惯于只使用主流操作系统,您可能会问:为什么要在这里使用常量$PATH总是$PATH无处不在
#define ENV_PATH "PATH"
#define ENV_USER "USER"
#define ENV_IFS "IFS"
...
在哪里可以找到这样的标题?任何特定于操作系统的头文件都可以工作:我只是不想自己为常量发明名称
编辑
如果您习惯于只使用主流操作系统,您可能会问:为什么要在这里使用常量$PATH总是$PATH无处不在强>
事实并非如此
在中,环境变量通常是小写的(显然是由于)
在Plan9衍生的新操作系统中,我正在重新考虑这个设计选择,以简化POSIX工具的集成。然而,由于我喜欢小写的环境变量,我希望当Jehanne将成为“唯一真正的操作系统”时,能够轻松地切换回小写名称:-d您可以这样做,并在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
}
编辑:不要忘记返回新的env[i]。如注释中所述,没有头文件提供应用程序和实用程序使用的任何POSIX指定的环境变量列表 “广泛使用的命令解释器和应用程序经常导出的某些变量”列表。(实际的环境变量列表需要重新格式化,但这里仍然是…) 与某些经常使用的变量冲突是不明智的 由广泛使用的命令解释器和应用程序导出:
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
要访问环境变量的值
指定char**environ
变量:
此外,以下变量必须由
用户(如果要直接使用):
extern char **environ;
初始化为指向
环境字符串。argv和environ阵列分别终止
通过空指针。终止argv
数组的空指针不计入argc
中
应用程序可以在一次操作中更改整个环境
通过将environ
变量指定为指向字符数组
指向新环境字符串的指针。赋值后
对于环境
,应用程序不应依赖于新环境
字符串环境的剩余部分,作为对getenv()
的调用,
putenv()
,setenv()
,unsetenv()
,或
依赖于环境变量的任何函数都可能
注意environ
已更改,请将环境字符串复制到
新建数组并指定environ
指向它
直接修改
environ
变量点具有未定义的行为
符合要求的多线程应用程序不得使用环境
变量来访问或修改任何环境变量,而任何其他
线程正在同时修改任何环境变量。打电话给
应考虑依赖于任何环境变量的任何函数
使用environ
变量访问该环境变量
POSIX和(特别是)C中都没有这样的标准头。您可以在程序开始时尝试获取env变量名称吗<代码>无效主(int ac、char**av、char**env)然后在路径、用户和IFS上循环?!为什么要再键入2个字符?路径总是路径。更改它永远不会起作用,因此没有必要将其定义为定义。@艺术编辑解释了为什么不是这样:例如,在Plan9中,用于搜索可执行文件的目录列表名为$path。@GiacomoTesio但是既不是
getenv(“path”)
,也不是getenv(MAGIC\u LONG\u STRING\u以\u path结尾)
将以您期望的格式返回path变量。如果您希望可移植到此类系统,则需要依赖操作系统的代码,用您自己的代码替换对getenv
的调用,或者需要模拟替换getenv
,以您期望的格式返回数据。这又回到了这样一个模拟函数不需要特殊的定义,这里只有第一句话提供了答案。其余的引用了一份已经在问题中链接的文件。。。