系统是否在文件中存储var ?
还是直接存储在内存中?
我在~/中找不到它。/etc/profile.
我在哪里可以找到它?由于
它存在于shell的内存中,并被复制到shell执行的任何命令的内存中。环境是正在运行的进程的属性,永远不会写入磁盘;如果您执行export WEBROOT=blah
,退出shell,然后重新启动它,您将看到WEBROOT
现在是空的。(你可以检查printenv
或echo $WEBROOT
)
一些shell启动脚本,如.bashrc
或.bash_profile
,包含将某些环境变量初始化为指定值的命令。但这些只是export
命令的录音,您可以在提示符下自己运行。它们不存储环境本身。
如果您编写C代码,您可能熟悉main
函数的标准原型:
int main(int argc, char** argv) {
// ...
}
但实际上,main
的另一个参数通常被省略:
int main(int argc, char** argv, char** envp) {
// ...
}
这个envp
是环境所在的地方——它由内核设置并压入main
之上的堆栈,就像程序参数一样。标准Unix环境还提供了指向该内存区域的environ
指针,供getenv
和setenv
等libc函数使用。
当程序调用exec
时,环境也被传递到该调用中,并被复制到exec
'd程序的初始堆栈中。可以看到系统调用的完整原型execve
采用这个指针:
int execve(const char *path, char *const argv[], char *const envp[]);
没有单独的文件存放envt变量。
在终端上执行printenv
。它将列出系统中声明的所有envt变量。
阅读更多信息:https://unix.stackexchange.com/questions/107407/from-where-does-printenv-command-read-environment-variables-which-i-have-not-def