在Linux
和Unix
系统中,环境变量是一组被动态命名值,存储在系统中,供在shell或子shell中启动的应用程序使用。简单来说,环境变量就是具有名称和相应关联值的变量。
环境变量允许你自定义系统的工作方式和系统中应用程序的行为。例如,环境变量可以存储有关默认文本编辑器或浏览器、可执行文件的路径或系统语言环境和键盘布局设置的信息。
变量具有以下形式:
KEY=value
KEY="Some other value"
KEY=value1:value2
:
字符分隔。=
周围没有空格。变量可以被归类为两类,环境变量和Shell变量。
环境变量是在系统范围内可用的变量,并由所有派生的子进程和shell继承。
Shell变量是仅应用于当前shell实例的变量。每个shell(如zsh和bash)都有自己的一组内部shell变量。
env
该命令允许您在自定义环境中运行另一个程序,而无需修改当前环境;当不带参数时,打印当前环境变量列表。printenv
打印所有环境变量或者指定的环境变量。set
设置或者取消设置Shell变量;不带参数使用时,他将打印包含环境变量和Shell变量的所有变量列表,以及Shell函数。unset
删除Shell变量和环境变量。export
设置环境变量。使用示例:
printenv LANG PWD #输出环境变量LANG和PWD
printenv #输出所有环境变量
set #输出所有环境变量、Shell变量以及Shell函数
set | less #直接调用输出太多,使用管道输出到less中
可以使用echo
指令输出shell变量,例如输出BASH_VERSION
变量的值:echo $BASH_VERSION
。
为了更好的展示Shell变量和环境变量的区别,我们从Shell变量开始,然后转移到环境变量:
创建一个名字为MY_VAR
值为linuxize
的Shell变量仅需要输入:
MY_VAR='linuxize'
可以通过使用echo $MY_VAR
指令,或者使用grep指令(set | grep MY_VAR
)来显示变量的值;
echo $MY_VAR
#output
linuxize
使用printenv MY_VAR
检测这个变量是不是环境变量,理所当然,输出为空,这个变量不是环境变量。
也可以打印子Shell中的变量来观察bash -c 'echo $MY_VAR'
,当然输出也是空值,因此这个变量不是环境变量。
export
指令常用来设置环境变量。创建环境变量可以简单地export Shell变量
来实现,例如:
export MY_VAR
printenv MY_VAR
#output
linuxize
当然也可以通过创建子shell来确认是否创建了环境变量,会得到同样的输出。
可以简单的通过一行来定义环境变量:
export MY_NEW_VAR="My New Var"
以这种方式创建的环境变量仅在当前会话中可用。如果你打开一个新的shell或登出,所有变量将丢失。
要使环境变量持久,需要在bash配置文件中定义这些变量。在大多数Linux发行版中,当你启动一个新的会话时,环境变量将从以下文件中读取:
/etc/environment
使用此文件设置系统范围的环境变量。此文件中的变量按以下格式设置:FOO=bar
VAR_TEST="Test Var"
/etc/profile
每当输入bash登录shell时,就会加载该文件中设置的变量。在此文件中声明环境变量时,需要使用export
命令:export JAVA_HOME="/path/to/java/home"
export PATH=$PATH:$JAVA_HOME/bin
~/.bashrc
每个用户shell特定的配置文件。例如,如果您正在使用Bash,则可以在~/.bashrc
中声明变量。export PATH="$HOME/bin:$PATH"
为了加载新的环境变量到当前shell会话中,可以使用source
命令:
source ~/.bashrc
关于C中的main函数,C标准有如下描述:
The function called at program startup is named main. The
implementation declares no prototype for this function. It shall
be defined with a return type of int and with no parameters:
int main(void) { /* … */ }
or with two parameters (referred to here as argc and argv, though
any names may be used, as they are local to the function in which
they are declared):
int main(int argc, char argv[]) { / … */ }
or equivalent;10) or in some other implementation-defined manner.
但是大部分编译器都支持main
函数接受第三个参数,第三个参数存储所有的环境变量。
#include
// Most of the C compilers support a third parameter to main which
// store all envorinment variables
int main(int argc, char *argv[], char * envp[])
{
int i;
for (i = 0; envp[i] != NULL; i++)
printf("\n%s", envp[i]);
getchar();
return 0;
}
如果你想用一个更标准的方式,则可以通过 extern char **environ;
来实现,关于environ
的更多信息可以通过man environ
来获得。
#include
#include
extern char **environ;
int main()
{
int i = 1;
char *s = *environ;
for (; s; i++)
{
printf("%s\n", s);
s = *(environ+i);
}
return 0;
}
获取单个环境变量getenv
:
char *getenv(const char *name); //name 也就是环境变量的名称,返回环境变量的值得指针,获取不到返回为空
设置单个环境变量setenv
:
//name 是环境变量的名字,value是环境变量的值,override环境变量存在且有值是否更新其值
int setenv(const char *name, const char *value, int overwrite);
两个函数包含在stdlib.h
中。